Posts filed under 'Программирование'

Автоматизация ввода адреса в справочник Контрагенты

В 1с существует возможность подключить базу адресов КЛАДР и при вводе использовать адрес из этой базы. В компоненте 1с 77 «Зарплата и кадры», в справочнике сотрудники есть спец. кнопка, которая открывает диалог с выбором значений из КЛАДР и помещает затем адрес в нужном формате в соответствующее поле справочника сотрудники. Эту кнопку можно скопировать в форму справочника Контрагенты, чтобы автоматизировать ввод адреса и в нем. При этом нужно не забыть поменять входной параметр функции, которая вызывается из кнопки вызова классификатора: «глВводАдреса(ПочтовыйАдрес)», здесь ПочтовыйАдрес имя переменной, куда будет помещаться строка с адресом в нужном формате.

30 comments Март 26th, 2008

Взаимодействие двух таблиц значений в форме 1С 7 версии.

tz.jpg

Формы (диалоги) в программе 1с отличаются от форм, которые используются в Visual Basic’е или VC++, прежде всего тем, что имеют меньше свойств. С одной стороны это упрощает работу, поскольку такие формы легче настраивать, с другой такие формы лишены функционала. Так я столкнулся с небольшой проблемой, когда мне понадобилось поместить на форму две таблицы значений, которые должны взаимодействовать друг с другом. Другими словами, при выборе строки в одной таблице значений, должна меняться (заполняться нужными значениями) вторая таблица значений.

Но поскольку форма в 1с (в отличие от привычной формы в Access например), не имеет свойства «при изменении» (так же как и элемент «таблица значений») эта задача превратилась в небольшую проблему.

Решить ее получилось, используя элемент текст, в который я, в поле формула вставил функцию «Обновить()», в которую, в свою очередь, прописал алгоритм обновления Элемента «Таблицы Значений». Эта функция всегда, возвращает пустое значение («»), поэтому на внешний вид формы не влияет.

Поскольку элемент «текст» обновляется автоматически, при изменении состояния формы, я таким образом добился нужного эффекта.

113 comments Январь 15th, 2008

Изменение элементов справочника из модуля формы документа

Описание проблемы.

Предположим, есть документ, в котором в качестве одного из элементов табличной части, используется справочник. Элемент справочника, в свою очередь, необходимо изменять в зависимости от документа. Например: есть документ «Прием Полисов из Страховой компании», один из атрибутов не табличной части документа является поле «Страховая Компания». В табличной части документа есть поле «Полис». В «Полисе» в свою очередь, есть также атрибут «Страховая компания». Для автоматизации процесса приема Полисов из страховой компании, требуется сделать так, чтобы при добавлении «Полиса» в табличную часть документа, атрибут «Страховая Компания» в полисе, заполнялся автоматически.

Следует отметить, что если элемент справочника «Полис» создается и заполняется до добавления в табличную часть документа, то проблем не возникает. Если же «Полис» уже выбран и находится в табличной части документа, изменить его, просто, обратившись из модуля формы к элементу, не удастся. При попытке выполнения следующего кода, будет сгенерирована ошибка «Объект заблокирован»:

            Полис.СК = «Росгосстрах»;
            Полис.Записать();
Обойти эту проблему, можно используя временную переменную и метод справочника «НайтиЭлемент». Следующий пример кода, не вызовет ошибок:

            п= СоздатьОбъект(”Справочник.Полисы”);
           
п.НайтиЭлемент(Полис);
            
п.СК = «Росгосстрах»;
            Полис.Записать();

37 comments Декабрь 26th, 2007

Экспорт данных из 1С в Excell в примерах

Не смотря на то, что в 1С достаточно хорошо реализованы таблицы, иногда появляется необходимоть сохранить данные в Excel, и там их окончательно отредактировать, поскольку Excel обладает большими возможностями по редактированию, фильтрации и оформлению данных представленных в табличном виде.

Хочу заранее оговориться, здесь идет разговор именно о программном экспорте данных. Поскольку чтобы сохранить отчет в Excel достаточно нажать кнопку с дискеткой и выбрать тип файла “*.xls”. :)

Итак рассмотрим конкретную задачу - экспорт справочника контрагенты в таблицу Excel:

1. Необходимо создать новую обработку

2. Открыть модуль формы и процедуре Выполнить() прописать следующий код:

Процедура Выполнить()
//экспорт элементов справочника в таблицу Excel

Путь = “C:\temp\пример.xls”;//путь к файлу (он должен быть уже создан)

ОбЕхсеl = СоздатьОбъект(”Excel.Application”); //создаем объект Excel
РабочиеКниги = ОбЕхсеl.Workbooks;  // … объект книга
РабочаяКнига = РабочиеКниги.Open(Путь);   // …ссылка на определенную книгу
РабочийЛист =  РабочаяКнига.Worksheets(1); //ссылка на первый лист в книге

ка = СоздатьОбъект(”Справочиник.Контрагенты”); //переменная для перебора элементов справочника контрагенты

ка.ВыбратьЭлементы();//перебор элементов + запись значений на рабочий лист
сч=2;
Пока ка.ПолучитьЭлемент()>0 Цикл

РабочийЛист.Cells(сч,2).Value)=ка.Наименование;
РабочийЛист.Cells(сч,3).Value)=ка.ПочтовыйАдрес;
РабочийЛист.Cells(сч,4).Value)=ка.Телефоны;
сч=сч+1
КонецЦикла;
//Экспорт закончен созранение и закрытие файла
РабочаяКнига=РабочаяКнига.Close;

КонецПроцедуры

PS: Поскольку обмен данными в данном примере реализован с помощью механизма OLE Automation, немного изменив код можно организовать подобным образом импорт в 1С базу из Excel, что на практике может оказаться гораздо полезнее.
Для того, например, чтобы присвоить значение элементу справочника контрагенты, достаточно выполнить следующий код:

ка.Телефоны = СокрЛП(РабочийЛист.Cells(сч,4).Value)); ка.Сохранить();

Add comment Август 8th, 2007


Calendar

Август 2011
Пн Вт Ср Чт Пт Сб Вс
« Мар    
1234567
891011121314
15161718192021
22232425262728
293031  

Posts by Month

Posts by Category


[removed] (function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter47677693 = new Ya.Metrika({ id:47677693, clickmap:true, trackLinks:true, accurateTrackBounce:true }); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n[removed].insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = "https://mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks"); [removed]