Фоновые задания: Пример запуска выполнения процедуры / функции на сервере Как в 1С производится запуск фоновых заданий, каким образом можно получить список заданий при помощи метода "ПолучитьФоновыеЗадания()?
В одном проекте понадобилось запускать выполнение выгрузки на сайт с сервера.
Пользователь на своем клиенте открывает обработку, устанавливает параметры и нажимает выгрузить.
Выгрузка идет не с компьютера клиента, а создается фоновое задание на сервере!
На клиенте в модуле Кнопки Выгрузить:
Код 1C v 8.3 Процедура КоманднаяПанель1ВыгрузитьНаСайт(Кнопка)
//Выгружается фоновым заданием на серваке
ПараметрыФоновогоЗадания = Новый Массив;
ПараметрыФоновогоЗадания.Добавить(Группа); //Группа номенклатуры
ФоновыеЗадания.Выполнить("МодульРегламентныхЗаданий.ВыгрузкаПрайсаНАФТП",
ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор,
"Выгрузка прайса на сайт");
ПоказатьОповещениеПользователя("Выгрузка прайса на сайт", ,"Запущено задание выгрузки прайса на сайт, проверьте данные на сайте через 2-3 минуты...", БиблиотекаКартинок.Информация32);
ПараметрыФоновогоЗадания - это переменные функции, они задаются по порядку как определены в вызываемой функции.
На сервере в общем модуле МодульРегламентныхЗаданий:
Код 1C v 8.3 Процедура ВыгрузкаПрайсаНАФТП(Группа) Экспорт
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ПрайсЛист1СрезПоследних.НоменклатураПрайса,
| ПрайсЛист1СрезПоследних.Цена
|ИЗ
| РегистрСведений.ПрайсЛист.СрезПоследних(, Поставщик = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК ПрайсЛист1СрезПоследних
|ГДЕ
| &Условие
| И ПрайсЛист1СрезПоследних.НоменклатураПрайса.ИДдляСайта > 0";
Если ЗначениеЗаполнено(Группа) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ПрайсЛист1СрезПоследних.НоменклатураПрайса В ИЕРАРХИИ(&НоменклатураПрайса)")
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ИСТИНА")
КонецЕсли;
Запрос.УстановитьПараметр("НоменклатураПрайса", Группа);
Выборка = Запрос.Выполнить().Выбрать();
Текст = Новый ТекстовыйДокумент;
Пока Выборка.Следующий() Цикл
НомПрайса = Выборка.НоменклатураПрайса;
ЦенаА = Выборка.Цена;
Цена = Ценообразование.ОкруглитьЦену(ЦенаА * ( 1 + НомПрайса.Наценка20 / 100) + НомПрайса.Надбавка20, НомПрайса.ПорядокОкругления, НомПрайса.ОкруглятьВБольшуюСторону);
Если Цена > 0 Тогда
Текст.ДобавитьСтроку(""+Формат(НомПрайса.ИДдляСайта, "ЧГ=0")+";"+Формат(Цена, "ЧГ=0"));
КонецЕсли;
КонецЦикла;
// запись в текстовый файл
ПутьКФайлВыгр = "\\FG-1\1c_data\naSite\vigruz.csv";//"D:\!!!For1C!!!\naSite\vigruz.csv";
Текст.Записать(ПутьКФайлВыгр, "windows-1251");
КаталогНаSFTPСервере = "/sitetest.ru/public_html/p";
Попытка
ИмяПользователя = "serveruser";
ПарольПользователя = "password";
Сервер = "192.253.6.47";
Порт = "21";
Прокси = Новый ИнтернетПрокси();
Прокси.Пользователь = ИмяПользователя;
Прокси.Пароль = ПарольПользователя;
FTPСоединение = Новый FTPСоединение(Сервер,,ИмяПользователя,ПарольПользователя,,Ложь);
FTPСоединение.УстановитьТекущийКаталог(КаталогНаSFTPСервере);
//FTPСоединение.ПассивныйРежим(Ложь);
ТекущийКаталог = FTPСоединение.ТекущийКаталог();
Исключение
КонецПопытки;
FTPСоединение.Записать(ПутьКФайлВыгр,"vigruz.csv");
//Вызов PHP скрипта для иморта данных из csv файла на сайт
НТТР = Новый HTTPСоединение("sitetest.ru");
ФайлРезультата = ПолучитьИмяВременногоФайла();
НТТР.Получить("/p/import_price.php", ФайлРезультата);
КонецПроцедуры
Как Получить фоновые задания?
Напишем в процедуре обработки нажания следующий код:
Код 1C v 8.2 УП &НаКлиенте
Процедура ПолучитьФоновыеЗадания(Команда)
ПолучитьФоновыеЗаданияНаСервере();
КонецПроцедуры
Текст процедуры на сервере:
Код 1C v 8.2 УП &НаСервере
Процедура ПолучитьФоновыеЗаданияНаСервере()
ПараметрыОтбора = Новый Структура("Наименование", "Тестовое задание");
СписокФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(ПараметрыОтбора);
Для каждого Задание Из СписокФоновыхЗаданий Цикл
Сообщить(Задание.Наименование);
КонецЦикла;
КонецПроцедуры // ПолучитьФоновыеЗаданияНаСервере()
В окно сообщений выведутся наименования выполняющихся и выполненных в 1С фоновых заданий с наименованием "Тестовое задание", так как мы сделали отбор именно по этому наименованию.
Категория:
Регламентные задания, Фоновые задания Загрузить данные в 1с из текстового файла с разделителями В этой статье я расскажу, как загружать данные в 1с 8 из простейших текстовых файлов с разделителями. Обычно они имеют расширение csv (Comma-Separated Values). Т. е. название подразумевает, что в каждой строке такого текстового файла значения разделены запятой. Но на самом деле, запятую, в качестве разделителя, использовать не надёжно. Поэтому применяют другие разделители, которые в обычном тексте встречаются редко. Это могут быть символы «^», «~»,«|» и другие. Итак, наша задача состоит в том, чтобы загрузить имеющуюся в csv файле информацию в базу данных 1с. Например, в файле будут содержаться товары интернет - магазина. В качестве образца, я взял выгрузку из магазина на скрипте virtuemart. Посмотрим, как выглядит файл.
Привожу две первых строки из него:
Код ~product_sku~^~category_path~^~product_name~^~product_desc~
~20~^~Книги/Электронные книги~^~Amazon Kindle 4 Touch~^~<p>Популярная электронная книга с ч/б экраном 6", электронной бумагой E-Ink Pearl, разрешением 600x800 пикс. с 16 - ю оттенками серого.</p>~
Посмотрим на файл.
Первая строка служебная. В ней описан формат нашего файла. Т. е. в какой ячейке, что находится. Однако, имейте в виду, что такой строки может и не быть.
Ячейки образуются при помощи разделителя «^», а данные в ячейках обрамляются символом «~».
В любой конфигурации 1с есть иерархический справочник товаров. В него и будем загружать информацию.
Создадим внешнюю обработку. Добавим строковый реквизит «путьКФайлуЗагрузки» для хранения имени файла. Добавим на форму поле ввода, связанное с данным реквизитом. Включим в свойствах поля ввода кнопку выбора и создадим обработчик события «НачалоВыбора» и напишем в нём такой код:
Код 1C v 8.х Процедура путьКФайлуЗагрузкиНачалоВыбора(Элемент, СтандартнаяОбработка)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "Comma separated file (*.csv)|*.csv";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
Если ДиалогОткрытияФайла.Выбрать() Тогда
путьКФайлуЗагрузки = ДиалогОткрытияФайла.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
Т. о. мы организовали диалог для выбора файла в нашей обработке.
Хорошо. Теперь, для удобства и наглядности я предлагаю создать временную табличку, в которую мы загрузим текстовый файл, а уже после её заполнения - будем осуществлять загрузку в базу 1с. Для этого, на форму добавим табличное поле «табЗагрузки», с типом значения «ТаблицаЗначений» и командной панелью. В панели поместим кнопку «Заполнить» и создадим обработчик её нажатия «КоманднаяПанель1Заполнить». Также для элемента универсальности, добавим в обработку два строковых реквизита «символОграничения» и «разделительПолей». В них мы будем хранить «^», и «~». Можно в теле модуля формы осуществить их начальную инициализацию:
разделительПолей = "^";
символОграничения = "~";
Это позволит пользователю задать свои значения и при желании сохранить настройку, которая впоследствии не затрется нашей инициализацией.
Код 1C v 8.х Процедура КоманднаяПанель1Заполнить(Кнопка)
Если табЗагрузки.Количество() > 0 И Вопрос("Таблица будет очищена. Вы уверены?",РежимДиалогаВопрос.ДаНет)
= КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ЗаполнитьТаблицу();
КонецПроцедуры
Процедура ЗаполнитьТаблицу()
текст = Новый ТекстовыйДокумент;
Попытка
//обязательно устанавливаем кодировку, в которой наш файл
текст.Прочитать(путьКФайлуЗагрузки,КодировкаТекста.UTF8);
Исключение
Сообщить("Не удалось прочитать файл: "
+ ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
табЗагрузки.Очистить();//очищаем таблицу
табЗагрузки.Колонки.Очистить();//удаляем колонки, так как их состав мог измениться
квоСтрок = текст.КоличествоСтрок();
Если Не квоСтрок > 0 Тогда
Сообщить("Файл пустой",СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
//получаем первую строку с форматом файла
стрТекста = текст.ПолучитьСтроку(1);
//преобразуем строку в массив при помощи функции общего модуля, которая есть в типовых
//ниже я дам её код, на случай, если нет
масЗначСтр = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(стрТекста,разделительПолей);
//добавляем две служебные колонки
//для возможности отказаться от загрузки определенной строки
табЗагрузки.Колонки.Добавить("не_загружать",Новый ОписаниеТипов("Булево"),"Не загружать");
//для удобства вывода комментариев с указанием номера строки по ходу загрузки
табЗагрузки.Колонки.Добавить("номер_строки",Новый ОписаниеТипов("Число",
Новый КвалификаторыЧисла(10,0,ДопустимыйЗнак.Неотрицательный)),"Номер строки");
//формируем колонки нашей таблицы
Для каждого зн Из масЗначСтр Цикл
//убираем лишний символОграничения
значение = СтрЗаменить(зн,символОграничения,"");
кол = табЗагрузки.Колонки.Добавить(значение,Новый ОписаниеТипов("Строка"));
КонецЦикла;
//создаём колонки в табличном поле
ЭлементыФормы.табЗагрузки.СоздатьКолонки();
//начиная со второй строки читаем строки файла, раскладывая их в массив
Для номСтр = 2 По квоСтрок Цикл
стрТекста = текст.ПолучитьСтроку(номСтр);
масЗначСтр = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(стрТекста,разделительПолей);
//добавляем новую строку в таблицу
новСтр = табЗагрузки.Добавить();
новСтр.номер_строки = номСтр;
//начиная с третьей колонки производим установку значений в колонки
номЗнач = 2;
Для каждого зн Из масЗначСтр Цикл
новСтр[номЗнач] = СтрЗаменить(зн,символОграничения,"");
номЗнач = номЗнач + 1;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функцию разложения строки с разделителями в массив можно разместить как в одном из общих модулей, так и непосредственно в обработке.
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
Отлично. В итоге, после заполнения, получим примерно такую картинку:
Теперь приступим непосредственно к загрузке товаров. Рядом с кнопкой «заполнить» добавим кнопку «загрузить» и добавим обработчик её нажатия «КоманднаяПанель1Загрузить», а также добавим реквизит «ПапкаЗагрузкиВыгрузкиТоваров» с типом вашего справочника товаров для опциональной их загрузки в определенную папку. Текст обработчика будет такой:
Код 1C v 8.х Процедура КоманднаяПанель1Загрузить(Кнопка)
Если Вопрос("Вы уверены, что хотите загрузить файл?", РежимДиалогаВопрос.ДаНет)
= КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ВсегоСтрок = табЗагрузки.Количество();
номСтр = 1;
Для каждого стрТЗ Из табЗагрузки Цикл
Состояние("Обработано: " + Окр(номСтр * 100 / ВсегоСтрок) + "%");
номСтр = номСтр + 1;
ОбработкаПрерыванияПользователя();
//если пользователь установил не_загружать = Истина, пропускаем
Если стрТЗ.не_загружать Тогда
Продолжить;
КонецЕсли;
объект1С = вернутьТовар(стрТЗ);
Если объект1С = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не ЗаписатьЭлементСпр(объект1С) Тогда
Сообщить("Загрузка прервана!",СтатусСообщения.ОченьВажное);
Возврат;
КонецЕсли;
//помечаем запись, как загруженную
стрТЗ.не_загружать = Истина;
КонецЦикла;
КонецПроцедуры
В приведенном коде две новые функции «вернутьТовар» и «ЗаписатьЭлементСпр». Вот их текст:
Код 1C v 8.х Функция вернутьТовар(стрТабФайла)
Артикул = стрТабФайла.product_sku;
Если Не ЗначениеЗаполнено(Артикул) Тогда
Сообщить("В строке " + стрТабФайла.номер_строки + " не заполнен product_sku",
СтатусСообщения.ОченьВажное);
Возврат Неопределено;
КонецЕсли;
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул");
Запрос.УстановитьПараметр("Артикул",Артикул);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка.ПолучитьОбъект();
Иначе
ЭтоНовый = Истина;
объект1С = Справочники.Номенклатура.СоздатьЭлемент();
объект1С.Артикул = Артикул;
объект1С.Наименование = стрТабФайла.product_name;
объект1С.Родитель = вернутьРодителяТовара(стрТабФайла.category_path);
Возврат объект1С;
КонецЕсли;
КонецФункции // вернутьТовар()
Функция ЗаписатьЭлементСпр(Спр)
Попытка
Спр.Записать();
Исключение
Сообщить("При записи элемента справочника " + Спр + " возникла ошибка: " + ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции // ЗаписатьЭлементСпр()
И осталась последняя новая функция для обработки родителя товара вернутьРодителяТовара. Текст её смотрите ниже. Комментарии по тексту.
Код 1C v 8.х Функция вернутьРодителяТовара(стрКатегории)
//главный родитель - заполненная в обработке папка
Родитель = ПапкаЗагрузкиВыгрузкиТоваров;
//строку категории раскладываем в массив используя разделитель /
масРодителей = РазложитьСтрокуВМассивПодстрок(стрКатегории,"/");
Для каждого Род Из масРодителей Цикл
//если папку не находим, создаём и назначаем в качестве родителя
//следующей и т. д. В случае проблем выдаём прекращаем загрузку
РодСс = Справочники.Номенклатура.НайтиПоНаименованию(Род,Истина);
Если РодСс.Пустая() Тогда
НовРод = Справочники.Номенклатура.СоздатьГруппу();
НовРод.Наименование = Род;
НовРод.Родитель = Родитель;
Если Не ЗаписатьЭлементСпр(НовРод) Тогда
Возврат Неопределено;
КонецЕсли;
Родитель = НовРод.Ссылка;
Иначе
Родитель = РодСс;
КонецЕсли;
КонецЦикла;
Возврат Родитель;
КонецФункции //
Все. Конечно, в реальной жизни еще много чего нужно будет дописать, но не все сразу. Такой шаблон можно использовать как отправную точку.
Скачивать файлы может только зарегистрированный пользователь!
Успехов в разработке!
Источник Категория:
Текстовый документ Форма ~ Программное добавление элементов на форму ЭлементыФормы (Controls) . Добавить (Add) - Добавляет элемент управления на форму.
Синтаксис: Код 1C v 8.х Добавить(<Тип>, <Имя>, <Видимость>, <ПоместитьНа>)
Параметры:
<Тип> (обязательный)
Тип: Тип. Тип добавляемого элемента управления:
Индикатор; ПолеКалендаря; Кнопка; КоманднаяПанель; Надпись; Панель; Переключатель; ПолеТабличногоДокумента; ПолеHTMLДокумента; ПолеТекстовогоДокумента; ПолеВвода; ПолеВыбора; ПолеСписка; ПолеКартинки; ПолосаРегулирования; Разделитель; РамкаГруппы; ТабличноеПоле; Флажок; ПолеГрафическойСхемы; ПолеГеографическойСхемы.
<Имя> (обязательный)
Тип: Строка. Имя создаваемого элемента управления. Имя должно быть указано в соответсвии с правилами написания имен системы 1С:Предприятие 8. В противном случае выполнение метода вызовет исключение.
<Видимость> (необязательный)
Тип: Булево. Определяет, создавать новый элемент управления формы видимым или нет. Истина - элемент создается видимым.
Значение по умолчанию: Истина
<ПоместитьНа> (необязательный)
Тип: Панель; ПолеТабличногоДокумента. Определяет, какой панели формы или какому табличному документу принадлежит создаваемый элемент. Если указана панель, то добавляемый элемент размещается на текущей странице панели. Если не указан, создаваемый элемент будет принадлежать непосредственно форме.
Код 1C v 8.х
// Расположим на странице табличное поле
ПолеРегистра = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"),
СтрокаТаблицы.Имя,
Истина,
ЭлементыФормы.ОсновнаяПанель);
ПолеРегистра.Данные = "ДокументОбъект.Движения." + СтрокаТаблицы.Имя;
Если НЕ ЭтоНовый() Тогда
ПолеРегистра.Значение.Прочитать();
КонецЕсли;
ПолеРегистра.Верх = 30;
ПолеРегистра.Лево = 6;
ПолеРегистра.Ширина = ЭлементыФормы.ОсновнаяПанель.Ширина - 14;
ПолеРегистра.Высота = ЭлементыФормы.ОсновнаяПанель.Высота - 56;
ПолеРегистра.ТолькоПросмотр = Ложь;
ПолеРегистра.ИзменятьПорядокСтрок = Истина;
ПолеРегистра.ИзменятьСоставСтрок = Истина;
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Верх,
КоманднаяПанельРегистра,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Право);
ПолеРегистра.СоздатьКолонки();
Если Метаданные.РегистрыНакопления[СтрокаТаблицы.Имя].ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
КолонкаВидДвижения = ПолеРегистра.Колонки.Вставить(1, "Вид движения");
КолонкаВидДвижения.Имя = "ВидДвиженияРегистраНакопления";
КолонкаВидДвижения.УстановитьЭлементУправления(Тип("ПолеВвода"));
КолонкаВидДвижения.Данные = "ВидДвижения";
КолонкаВидДвижения.ЭлементУправления.КнопкаВыбора = Истина;
КолонкаВидДвижения.ЭлементУправления.ВыбиратьТип = Ложь;
КонецЕсли;
ПолеРегистра.Колонки.Регистратор.Видимость = Ложь;
ПолеРегистра.Колонки.Период.Видимость = Ложь;
ПолеРегистра.Колонки.НомерСтроки.Видимость = Ложь;
// Поле ввода
ПолеВвода = ЭлементыФормы.Добавить(Тип("ПолеВвода"), "ПолеВвода", Истина);
ПолеВвода.Верх = Надпись.Верх + Надпись.Высота + 5;
ПолеВвода.Лево = ЭлементыФормы.Переключатель1.Лево;
ПолеВвода.Ширина = ЭлементыФормы.Переключатель1.Ширина;
ПолеВвода.Высота = ЭлементыФормы.Переключатель1.Высота;
ПолеВвода.Доступность = Ложь;
// установка привязок
ПолеВвода.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ПолеВвода, ГраницаЭлементаУправления.Верх);
ПолеВвода.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ЭтаФорма.Панель, ГраницаЭлементаУправления.Лево);
ПолеВвода.УстановитьПривязку(ГраницаЭлементаУправления.Право, ЭтаФорма.Панель, ГраницаЭлементаУправления.Право);
//Надпись и поле ввода
ЭлементНадпись = ЭлементыФормы.Добавить(Тип("Надпись"), "Надпись"+ИмяЭлемента, Истина, ЭлементыФормы.ПанельПодбор);
ЭлементНадпись.Заголовок = Синоним + ":";
ЭлементНадпись.Лево = 6;
ЭлементНадпись.Верх = ВерхЭлемента + 6;
ЭлементНадпись.Высота = 19;
ЭлементНадпись.Ширина = 160;
ЭлементНадпись.ЦветФона = ЦветаСтиля.ФонЭпицентра;
ЭлементПолеВвода = ЭлементыФормы.Добавить(Тип("ПолеВвода"), ИмяЭлемента, Истина, ЭлементыФормы.ПанельПодбор);
ЭлементПолеВвода.ТипЗначения = Параметр.Тип;
ЭлементПолеВвода.Верх = ЭлементНадпись.Верх;
ЭлементПолеВвода.Лево = ЭлементНадпись.Лево + ЭлементНадпись.Ширина + 6;
ЭлементПолеВвода.Высота = ЭлементНадпись.Высота;
Если ЭлементПолеВвода.ТипЗначения.СодержитТип(Тип("Дата")) Тогда
ЭлементПолеВвода.Ширина = 80;
Иначе
ЭлементПолеВвода.Ширина = 200;
КонецЕсли;
//Надпись и Поле Выбора
ИмяЭлемента = " Подписывающий";
ЭлементНадпись = ЭлементыФормы.Добавить(Тип("Надпись"), "Надпись"+ИмяЭлемента, Истина,);
ЭлементНадпись.Заголовок = ИмяЭлемента + ":";
ЭлементНадпись.Лево = 250;
ЭлементНадпись.Верх = 33;
ЭлементНадпись.Высота = 19;
ЭлементНадпись.Ширина = 160;
ЭлементНадпись.ЦветФона = ЦветаСтиля.ЦветФонаФормы;
ЭлементПолеВвода = ЭлементыФормы.Добавить(Тип("ПолеВыбора""), ИмяЭлемента, Истина,);
ЭлементПолеВвода.Данные = Подписывающий;
//ЭлементПолеВвода.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.СотрудникиОрганизаций");
ЭлементПолеВвода.Верх = ЭлементНадпись.Верх;
ЭлементПолеВвода.Лево = ЭлементНадпись.Лево + ЭлементНадпись.Ширина + 6;
ЭлементПолеВвода.Высота = ЭлементНадпись.Высота;
ЭлементПолеВвода.Ширина = 200;
Категория:
Работа с Формой (Диалог) и её элементами Кнопка ~ Программное добавление стандартных действий на командную панель формы Добавим кнопку Открыть, вызывающую процедуру ОткрытьЭлемент
Код 1C v 8.х //обращение к командной панели в форме
КомПанель = ЭлементыФормы.КоманднаяПанельТаблицы;
// добавим кнопку Открыть, вызывающую процедуру ОткрытьЭлемент
КомПанель.Кнопки.Добавить("кнОткрыть",
ТипКнопкиКоманднойПанели.Действие,
"Открыть",
Новый Действие("ОткрытьЭлемент"));
//сделаем командную панель доступной
КомПанель,Доступность = Истина;
Как программно добавить в командную панель кнопку со стандартной функцией "Сортировать по убыванию"?
Можно, например, включить автозаполнение в ком. панели, потом при открытии создать структуру или массив с действиями, заполнить его, и после этого отключить автозаполнение
Код 1C v 8.х Мас=Новый Массив;
Мас.Добавить(ЭлементыФормы.КоманднаяПанель1.Кнопки.Действие2.Действие);
ЭлементыФормы.КоманднаяПанель1.АвтоЗаполнение = Ложь;
ЭлементыФормы.КоманднаяПанель1.Кнопки.Добавить("НоваяКнопка",ТипКнопкиКоманднойПанели .Действие,"Новая кнопка",Мас[0]);
Категория:
Работа с Формой (Диалог) и её элементами Кнопка ~ Как в командной панели создать подменю с кнопками? Код 1C v 8.х КнопкиКоманднойПанели = ЭлементыФормы.КоманднаяПанельФормы.Кнопки;
// Проверить, нет ли уже на командной панели кнопки "Сформировать".
// Если есть - удалить.
Индекс = КнопкиКоманднойПанели.Индекс(КнопкиКоманднойПанели.Найти("Сформировать"));
Если Индекс = -1 Тогда
Индекс = 0;
Иначе
КнопкиКоманднойПанели.Удалить(Индекс);
КонецЕсли;
// Создать подменю "Сформировать".
ПодменюСформировать = КнопкиКоманднойПанели.Вставить(Индекс, "Сформировать", ТипКнопкиКоманднойПанели.Подменю, "Сформировать");
// Добавить картинку.
ПодменюСформировать.Картинка = БиблиотекаКартинок.Сформировать;
ПодменюСформировать.Отображение = ОтображениеКнопкиКоманднойПанели.НадписьКартинка;
// Опросить перечисление о возможных вариантах периодичности.
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Перечисление.Периодичность");
Выборка = Запрос.Выполнить().Выбрать();
//Добавить кнопки к подменю.
Пока Выборка.Следующий() Цикл
Период = Выборка.Ссылка;
ПодменюСформировать.Кнопки.Добавить("кн" + Период, ТипКнопкиКоманднойПанели.Действие, "Сформировать за " + Период, Новый Действие("КнопкаСформироватьНажатие"));
КонецЦикла;
Категория:
Работа с Формой (Диалог) и её элементами Как для Подбора Элемента Справочника Открыть Форму Подбора с нужной Открытой Группой? В продолжении
Как для Выбора Элемента Справочника Открыть Форму Выбора с нужной Открытой Группой? опишу как настроить Подбор, на примере Типовой Бухгалтерии:
1. Откроем документ Реализации и зайдем в Свойства Кнопки
Подбор
2. И так попорядку:
Кнопка вызывает процедуру:
Код 1C v 8.х Процедура КоманднаяПанельТоварыДействиеПодбор(Кнопка)
ДействиеПодбор(Товары);
КонецПроцедуры
Далее вызывается процедура
ДействиеПодбор
Код 1C v 8.х Процедура ДействиеПодбор(ТабличнаяЧасть)
Перем Команда, Валюта;
ЕстьЦена = Истина;
Если ТабличнаяЧасть = Товары Тогда
Команда = "ПодборВТабличнуюЧастьТовары";
Валюта = ВалютаДокумента;
СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры;
ИмяТабличнойЧасти = "Товары";
ИначеЕсли ТабличнаяЧасть = ВозвратнаяТара Тогда
//.................Прочие условия и т.д.
КонецЕсли;
СписокВидовПодбора = СформироватьСписокЗапросовДляПодбора(ТабличнаяЧасть);
ПредставлениеДок = Метаданные().Представление();
СтруктураПараметровПодбора = Новый Структура();
СтруктураПараметровПодбора.Вставить("Команда" , Команда);
СтруктураПараметровПодбора.Вставить("СписокВидовПодбора" , СписокВидовПодбора);
// Параметры запросов.
ВременнаяДатаРасчетов = ?(НачалоДня(Дата) = НачалоДня(ТекущаяДата()), Неопределено, Дата);
СтруктураПараметровПодбора.Вставить("ДатаРасчетов" , ВременнаяДатаРасчетов);
СтруктураПараметровПодбора.Вставить("Склад" , Склад);
СтруктураПараметровПодбора.Вставить("ТипЦен" , ТипЦен);
СтруктураПараметровПодбора.Вставить("ДоговорКонтрагента", ДоговорКонтрагента);
СтруктураПараметровПодбора.Вставить("Контрагент" ,Контрагент);
СтруктураПараметровПодбора.Вставить("Организация" , Организация);
СтруктураПараметровПодбора.Вставить("СпособЗаполненияЦен" , СпособЗаполненияЦен);
СтруктураПараметровПодбора.Вставить("ЕстьЦена" , ЕстьЦена);
СтруктураПараметровПодбора.Вставить("ВалютаДокумента" , Валюта);
СтруктураПараметровПодбора.Вставить("Заголовок", "Подбор номенклатуры в документ " + ПредставлениеДок + " № " + Номер + " (" + ИмяТабличнойЧасти + ")");
РаботаСДиалогами.ОткрытьПодборНоменклатуры(ЭтаФорма, СтруктураПараметровПодбора, мФормаПодбораНоменклатуры);
КонецПроцедуры
Из нее для открытия Подбора вызывается
ОткрытьПодборНоменклатуры из общего Модуля
РаботаСДиалогами :
Сюда и добавляем Наши изменения
Код 1C v 8.х Процедура ОткрытьПодборНоменклатуры(ФормаДокумента, СтруктураПараметров, ФормаПодбора = Неопределено) Экспорт
// Добавляем обработчики в форму
МетаданныеДокумента = ФормаДокумента.ДокументОбъект.Метаданные();
Для Каждого ЭлементСтруктурыПараметров Из СтруктураПараметров Цикл
Если ОбщегоНазначения.ЕстьРеквизитДокумента(ЭлементСтруктурыПараметров.Ключ, МетаданныеДокумента) Тогда
ФормаДокумента.ПодключитьОбработчикИзмененияДанных(ЭлементСтруктурыПараметров.Ключ, "ОбновитьФормуПодбора", Ложь);
КонецЕсли;
КонецЦикла;
// Открываем форму подбора.
ФормаПодбора = Обработки.ПодборНоменклатуры.ПолучитьФорму("ОсновнаяФорма", ФормаДокумента, ФормаДокумента);
ФормаПодбора.ОбработкаОбъект.СтруктураИсходныхПараметров = СтруктураПараметров;
//- НАЧАЛО Изменения для Установки Родителя В Подборе
//НУЖНО чтобы при открытии Подбора номенклатуры Открывалась номенклатура из Групы Оргтехника (код 00000013608)
// НА ФОРМЕ ВЫБОРА СЛЕВА ЕСТЬ ДЕРЕВО ГРУПП, установим значение нужного нам Родителя в нем:
ФормаПодбора.ЭлементыФормы.ДеревоНоменклатуры.ТекущаяСтрока = Справочники.Номенклатура.НайтиПоКоду("00000013608");
// - КОНЕЦ Изменений
ФормаПодбора.Открыть();
КонецПроцедуры
Все, перезапускаем и пользуемся
Категория:
Справочники Быстрый отбор в справочнике по первой букве В статье описан способ быстрой организации отбора в списке справочника по первой букве наименования. Механизм легко дотачивается под собственные нужды.
Код 1C v 8.2 УП // ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
&НаКлиенте
Процедура УстановитьПометку(Команда)
Для Каждого Кнопка Из Элементы.ПанельСБуквами.ПодчиненныеЭлементы Цикл
Кнопка.Пометка = (Команда.Имя = Кнопка.Имя);
КонецЦикла;
КонецПроцедуры // УстановитьПометку()
&НаСервере
Процедура ПодготовитьДинамическийСписок()
Список.ПроизвольныйЗапрос = Истина;
ТекстЗапроса =
"ВЫБРАТЬ *
|ИЗ
| %ИмяТаблицы% КАК Т
|{ГДЕ
| (ПОДСТРОКА(Т.Наименование, 1, 1) В (&СписокБукв))}";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ИмяТаблицы%", Список.ОсновнаяТаблица);
Список.ТекстЗапроса = ТекстЗапроса;
КонецПроцедуры // ПодготовитьДинамическийСписок()
&НаСервере
Процедура СоздатьПанельСБуквами()
ПанельСБуквами = Элементы.Вставить("ПанельСБуквами", Тип("ГруппаФормы"), ЭтаФорма, Элементы.Список);
ПанельСБуквами.Вид = ВидГруппыФормы.КоманднаяПанель;
// кнопка "Все"
КомандаФормы = Команды.Добавить("Все");
КомандаФормы.Действие = "УдалитьФильтрПоПервойБукве";
КнопкаФормы = Элементы.Добавить("Все", Тип("КнопкаФормы"), ПанельСБуквами);
КнопкаФормы.ИмяКоманды = "Все";
КнопкаФормы.Пометка = Истина;
// кнопки А...Я
Для Сч = КодСимвола("А") По КодСимвола("Я") Цикл
ИмяКоманды = Символ(Сч);
Если Найти("Ё,Й,Ъ,Ь", ИмяКоманды) > 0 Тогда
Продолжить;
КонецЕсли;
КомандаФормы = Команды.Добавить(ИмяКоманды);
КомандаФормы.Действие = "УстановитьФильтрПоПервойБукве";
КнопкаФормы = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ПанельСБуквами);
КнопкаФормы.ИмяКоманды = ИмяКоманды;
КонецЦикла;
КонецПроцедуры // СоздатьПанельСКнопками()
////////////////////////////////////////////////////////////////////////////////
// КОМАНДЫ МОДУЛЯ
&НаКлиенте
Процедура УстановитьФильтрПоПервойБукве(Команда)
Буква = Команда.Имя;
СписокБукв = Новый Массив;
СписокБукв.Добавить(Буква);
СписокБукв.Добавить(НРег(Буква));
Если Буква = "Е" Тогда
СписокБукв.Добавить("Ё");
СписокБукв.Добавить("ё");
КонецЕсли;
Если Буква = "И" Тогда
СписокБукв.Добавить("Й");
СписокБукв.Добавить("й");
КонецЕсли;
Список.Параметры.УстановитьЗначениеПараметра("СписокБукв", СписокБукв);
УстановитьПометку(Команда);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьФильтрПоПервойБукве(Команда)
ПараметрКомпоновкиДанных = Новый ПараметрКомпоновкиДанных("СписокБукв");
ЗначениеПараметраКомпоновкиДанных = Список.Параметры.НайтиЗначениеПараметра(ПараметрКомпоновкиДанных);
Если ЗначениеПараметраКомпоновкиДанных = Неопределено Тогда
Возврат;
КонецЕсли;
ЗначениеПараметраКомпоновкиДанных.Использование = Ложь;
УстановитьПометку(Команда);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПодготовитьДинамическийСписок();
СоздатьПанельСБуквами();
КонецПроцедуры // ПриСозданииНаСервере()
Данный текст необходимо вставить в модуль формы списка справочника.
Процедуру "ПриСозданииНаСервере" вручную назначить обработчиком одноименного события формы.
Если данному событию уже назначен обработчик, то необходимо дополнить его строками процедуры "ПриСозданииНаСервере" из листинга.
Реквизита формы "Список"
не должен содержать произвольного запроса. Если список формируется произвольным запросом, то в запрос необходимо дописать условие компоновки:
{ГДЕ (ПОДСТРОКА(ИмяТаблицы.Наименование, 1, 1) В (&СписокБукв))}
и удалить процедуру "ПодготовитьДинамическийСписок" и все ее вызовы.
Автор
Armando Категория:
Справочники Как сделать подбор элементов справочника в табличную часть документа? Нужно на форме документа сделать кнопочку Подбор для справочника сотрудники и чтобы выбранные элементы добавлялись в табличное поле документа?
В данной статье я приведу пример подбора элемента справочника в Список значений и в Табличную часть!
Создаем на форме следующие элементы:
Логика такова:
При нажатии на кнопку
ПОДБОР (Процедура КоманднаяПанельПодбор) должена открыться форма подбора сотрудников:
Для Списка значений (СЗ) - ОткрытьФормуВыбораСотрудника(ЭлементыФормы.СписокСотрудников, ЭтотОбъект, Ложь, );
Для Табличного поля (ТП) - ОткрытьФормуВыбораСотрудника(ЭлементыФормы.ТабличноеПолеРаботники, ЭтотОбъект, Ложь, );
Далее открывается форма подбора сотрудника, при двойном щелчке - сотрудник должен добавится в СЗ или ТП.
Для этого у СЗ и ТП в Свойства - События добавляем ОбработкуВыбора :
Для Списка значений (СЗ) - Процедура СписокСотрудниковОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Для Табличного поля (ТП) - Процедура ТабличноеПолеРаботникиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
А в них пропишем проверку, добавлен сотрудник или нет - чтобы не было задвоений!
И так, код будет следующий:
Код 1C v 8.х //Процедура кнопки очистить список значений
Процедура КоманднаяПанельОчистить(Кнопка)
СписокСотрудников.Очистить();
КонецПроцедуры
// Процедура открывает форму выбора сотрудников организации
// Параметры:
// Владелец - владелец формы
// Ключ - ключ, ссылка на объект из которого открывается форма
// ЗакрыватьПриВыборе - Булево, закрывать ли нет
// ГоловнаяОрганизация - головная организация
//
Процедура ОткрытьФормуВыбораСотрудника(Владелец, Ключ, ЗакрыватьПриВыборе, ГоловнаяОрганизация = Неопределено) Экспорт
СтандартнаяОбработка = Ложь;
Форма = Справочники.СотрудникиОрганизаций.ПолучитьФормуВыбора(, Владелец, Ключ);
Форма.ЗакрыватьПриВыборе = ЗакрыватьПриВыборе;
//установим отборы по организации и виду договора
Если ЗначениеЗаполнено(ГоловнаяОрганизация) Тогда
Форма.Отбор.Организация.Установить(ГоловнаяОрганизация);
Форма.Отбор.Организация.Использование = ЗначениеЗаполнено(ГоловнаяОрганизация);
КонецЕсли;
СписокДоговоров = Новый СписокЗначений;
СписокДоговоров.Добавить(Перечисления.ВидыДоговоровСФизЛицами.ТрудовойДоговор);
СписокДоговоров.Добавить(Перечисления.ВидыДоговоровСФизЛицами.Подряда);
СписокДоговоров.Добавить(Перечисления.ВидыДоговоровСФизЛицами.Авторский);
Форма.Отбор.ВидДоговора.ВидСравнения = ВидСравнения.ВСписке;
Форма.Отбор.ВидДоговора.Использование = Истина;
Форма.Отбор.ВидДоговора.Значение = СписокДоговоров;
//Открываем форму выбора
Форма.Заголовок = "Выберите работников:";
Форма.Открыть();
КонецПроцедуры
//Процедура кнопки подбор
Процедура КоманднаяПанельПодбор(Кнопка)
// Процедура для подбора в табличное поля
ОткрытьФормуВыбораСотрудника(ЭлементыФормы.ТабличноеПолеРаботники, ЭтотОбъект, Ложь, );
// Процедура для подбора в список значений
ОткрытьФормуВыбораСотрудника(ЭлементыФормы.СписокСотрудников, ЭтотОбъект, Ложь, );
КонецПроцедуры
//Обработка Выбора значения для списка значений
Процедура СписокСотрудниковОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.СотрудникиОрганизаций") Тогда
//Для того чтобы не было задвоений при выборе, наложим условие
Если СписокСотрудников.НайтиПоЗначению(ВыбранноеЗначение) = Неопределено Тогда
НоваяСтрока = СписокСотрудников.Добавить();
НоваяСтрока.Значение = ВыбранноеЗначение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Обработка Выбора значения для табличного поля
Процедура ТабличноеПолеРаботникиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.СотрудникиОрганизаций") Тогда
//Для того чтобы не было задвоений при выборе, наложим условие
Если ТабличноеПолеРаботники.НайтиСтроки(Новый Структура("Работник", ВыбранноеЗначение)).Количество() = 0 Тогда
НоваяСтрока = ТабличноеПолеРаботники.Добавить();
НоваяСтрока.Работник = ВыбранноеЗначение;
// далее можно описать заполнение других колонок табличного поля
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Автор: Мигачев Евгений Категория:
Справочники Универсальная форма для выбора пользователем значения из списка значений В данной статье описан пример создания универсальной Формы работы со списком значений:
1. Создадим в общих формах новую форму "ФормаРаботыСоСпискомЗначений", добавим на ней Табличное поле (Имя - СписокЗначений) и КоманднаяПанельСписокЗначений
На закладке Реквизиты, появится реквизит СписокЗначений
2. Привяжем КоманднаяПанельСписокЗначений к Источнику действий - СписокЗначений
3. В свойствах табличного поля пропишем События - Выбор и ПередНачаломДобавления
4. В модуле Формы пропишем обработку событий
Код 1C v 8.х Процедура ОсновныеДействияФормыВыбрать(Кнопка)
ТекущаяСтрока = ЭлементыФормы.СписокЗначений.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
Закрыть(ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
Процедура СписокЗначенийПередНачаломДобавления(Элемент, Отказ, Копирование)
Отказ = Истина;
КонецПроцедуры
Процедура СписокЗначенийВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ТекущаяСтрока = ЭлементыФормы.СписокЗначений.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
Закрыть(ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
Процедура ЗакрытьФорму(Кнопка) //процедура действия кнопки закрыть
Закрыть();
КонецПроцедуры
Все, форма создана
Использовать ее для выбора значения, можно с помощью кода:
Код 1C v 8.х //К примеру Пользователю необходимо выбрать Вид расчета по которому в дальнейшем сформировать отчет.
Массив = ТаблицаНачислений.ВыгрузитьКолонку("Видрасчета"); //Выгружаем из таблицы начислений в Массив Виды Расчетов
Список = Новый СписокЗначений; // Создадим Список
Список.ЗагрузитьЗначения(Массив); // Загрузим в список Виды расчета из массива
ФормаРаботыСоСпискомЗначений = ПолучитьОбщуюФорму("ФормаРаботыСоСпискомЗначений"); // Получаем Нашу Универсальную Форму
ФормаРаботыСоСпискомЗначений.СписокЗначений = Список; // Передаем в нее список Видов Расчетов
ЭлементСписка = ФормаРаботыСоСпискомЗначений.ОткрытьМодально(); //Отрываем форму, чтобы пользователь выбрал значение из списка
//ЭлементСписка - Выбранный элемент, Если пользователь ничего не выбрал, а нажал Закрыть,
//то ЭлементСписка = Неопределено и пусть отчет формируется по всем Видам расчетов
Если ЭлементСписка <> Неопределено Тогда
ВидРасчета=ЭлементСписка.Значение; //Пользователь Выбрал из списка Вид расчета, формируем отчет по нему.
иначе
СписокВидовРасчетов = ФормаРаботыСоСпискомЗначений.СписокЗначений; // Пользователь нажал кнопку Закрыть, формируем по всем Видам Расчетов
КонецЕсли;
//----------------------Далее уже ваш модуль обработки...------------------------------------//
Пользователь увидит окно выбора значения:
Категория:
Работа с Списком Значений Кнопка ~ Программное добавление кнопок на командную панель формы Код 1C v 8.х //Переберая перечисления, добавим кнопки с именем значение перечисления, и возможностью установки пометки
для каждого метпер из Метаданные.Перечисления.СостоянияРаботникаОрганизации.ЗначенияПеречисления Цикл
МенюКнопки = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ПодменюНеявки.Кнопки;
НоваяКнопка = МенюКнопки.Вставить(инд, метпер.Имя, ТипКнопкиКоманднойПанели.Действие, метпер, Новый Действие("Пометка"));
//Работает и Командировка - считается рабочими видами
Если НЕ (метпер.Имя="Работает" или метпер.Имя="Командировка") тогда
НоваяКнопка.Пометка = Истина; //поставим помету
КонецЕсли;
инд=инд+1;
КонецЦикла;
// а Действие("Пометка") это:
Процедура Пометка(Кнопка)
Кнопка.Пометка=?(Кнопка.Пометка, Ложь, Истина);
// Можно и так:
// Кнопка.Пометка = Не Кнопка.Пометка;
КонецПроцедуры
Следующий пример показывает как выгрузить из табличной части Подразделения, удалить повторяющиеся и в "КоманднаяПанельЗарплата" - меню "ФормированиеВедомостей" - подменю "СформироватьПоПодразделению" добавить для каждого подразделения кнопку формирования ведомости
Код 1C v 8.х // заполним меню подразделений для ведомостей
ТзПодразделений=Зарплата.ВыгрузитьКолонку("ПодразделениеРаботника");
//Удалим в массиве задвоения
ТекущийИндекс = 0;
ВсегоЭлементов = ТзПодразделений.Количество();
Пока ТекущийИндекс < ВсегоЭлементов Цикл
Индекс2 = ТекущийИндекс + 1;
Пока Индекс2 < ВсегоЭлементов Цикл
Если ТзПодразделений[Индекс2] = ТзПодразделений[ТекущийИндекс] Тогда
ТзПодразделений.Удалить(Индекс2);
ВсегоЭлементов = ВсегоЭлементов - 1;
Иначе
Индекс2 = Индекс2 + 1;
КонецЕсли;
КонецЦикла;
ТекущийИндекс = ТекущийИндекс + 1;
КонецЦикла;
инд=0;
для каждого ТекПодразд из ТзПодразделений Цикл
МенюКнопки = ЭлементыФормы.КоманднаяПанельЗарплата.Кнопки.ФормированиеВедомостей.Кнопки.СформироватьПоПодразделению.Кнопки;
НоваяКнопка = МенюКнопки.Вставить(инд, ТекПодразд, ТипКнопкиКоманднойПанели.Действие, ТекПодразд, Новый Действие("СформироватьВедомостиПоПодразделению"));
инд=инд+1;
КонецЦикла;
Категория:
Работа с Формой (Диалог) и её элементами