В типовых конфигурация существует подсистема заполнения табличных частей, которая позволяет непосредственно обрабатывать документы и справочники, не модифицируя код конфигурации и не снимая ее с поддержки.
Конфигурации на обычных формах встречаются повсеместно, поэтому очень важно знать про такую возможность 1С и уметь создавать обработки.
Рассмотрим ее создание на примере документа «Перемещение товаров» конфигурации «Бухгалтерия предприятия 2.0»
Быстрый переход
Как создать свою обработку заполнения с нуля?
- Создаете обработку в конфигуратор: меню «Файл\Новый\Внешняя обработка»
- Задаете ее имя без пробелов и синоним, под которым эта обработка будет подключаться
- В модуле объектов добавляете процедуру «Инициализировать()». Она должна быть экспортной и иметь 3 параметра (с удобными вам именами)
Процедура Инициализировать(Объект, ИмяТабличнойЧасти=Неопределено, ТабличноеПоле=Неопределено)Экспорт ТабличнаяЧасть = Объект[ИмяТабличнойЧасти]; //Теперь можно ее обрабатывать КонецПроцедуры;
- Добавляете по желанию Макет «Параметры авторегистрации»
- Добавляете обработку в «Дополнительные обработки табличных частей» в меню «Сервис\Дополнительные обработки»
- Используете после перезапуска 1С в меню «Заполнить» выбранной табличной части
Вот так быстро и просто создается обработка. Остается только написать код обработчика )
Особенности использования
Обработка запускается всегда из формы объекта.
Конфигурация предоставляет доступ непосредственно к объекту, даже если он не записан.
- Это очень удобно.
- Необходимо помнить что объект может быть не записан и его «Ссылка» пустая и запросом его данные не получишь.
Требуется дополнительные права для использования подсистемы рядовым пользователем: за это отвечает роль «ПравоЗапускаВнешнихОбработок»
Отлаживать обработку сложнее
- можно использовать обработку-прослойку
- добавить форму обработки, а в ней реквизит формы с типом отлаживаемого, вызов отладки: «Инициализировать(СсылкаНаОтлаживаемыйОбъект.ПолучитьОбъект(), «Товары»);
- ставить точку остановка в общем модуле
В процессе разработки придется регулярно обновлять обработку в справочнике внешних отчетов (такое обновление не требует перезапуска 1С).
Необходимо отрабатывать все возможные места ошибок, ведь конфигурация запускает обработку через «Попытку Исключение» — значит код прерываться будет именно там, а не в месте ошибок.
Обрабатываемый объект может изменятся разработчиком конфигурации — переименовываться его реквизиты — это сделает обработку неработоспособной, если вы не примете дополнительные меры.
Возможно программное открытие формы обработки, это позволит вам сделать удобный диалог, а даже альтернативный «Подбор документов».
Вам доступно чтение и изменение реквизитов объекта — не обязательно должна быть обработана табличная часть.
Она может быть пустой — главное, чтобы было к чему прописаться для обработки.
Окончательный код обработчика (для примера)
Процедура Инициализировать(Объект, ИмяТабличнойЧасти = Неопределено, ТабличноеПоле = Неопределено) Экспорт Попытка Товары = Объект[ИмяТабличнойЧасти]; Исключение Сообщить("Отсутствует табличная часть "+ИмяТабличнойЧасти + " в документе"); Возврат; КонецПопытки; Товары.Очистить(); ИмяРеквизитаСклада = ?(ТипЗнч(Объект) = Тип ("ДокументОбъект.ПеремещениеТоваров"),"СкладОтправитель","Склад"); Попытка Склад = Объект[ИмяРеквизитаСклада]; Исключение Сообщить("Отсутствует реквизит склад "+ИмяРеквизитаСклада + " в документе"); Возврат; КонецПопытки; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйОстатки.Субконто1, | ХозрасчетныйОстатки.Счет, | ХозрасчетныйОстатки.КоличествоОстатокДт, | ХозрасчетныйОстатки.Субконто1.БазоваяЕдиницаИзмерения как ЕдиницаИзмерения |ИЗ | РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В ИЕРАРХИИ (&Счет), , Субконто2 = &Склад) КАК ХозрасчетныйОстатки"; Запрос.УстановитьПараметр("Период", Объект.Дата-1); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.Товары); Запрос.УстановитьПараметр("Склад", Склад); Попытка Выборка = Запрос.Выполнить().Выбрать(); Исключение Сообщить("При запросе по остаткам склада ошибка: "+ОписаниеОшибки()); Возврат; КонецПопытки; Пока Выборка.Следующий() Цикл СтрокаТ = Товары.Добавить(); СтрокаТ.Номенклатура = Выборка.Субконто1; СтрокаТ.ЕдиницаИзмерения = Выборка.ЕдиницаИзмерения; СтрокаТ.Коэффициент = 1; СтрокаТ.Количество = Выборка.КоличествоОстатокДт; СтрокаТ.СчетУчета = Выборка.Счет; Если ИмяРеквизитаСклада = "СкладОтправитель" Тогда //это перемещение СтрокаТ.НовыйСчетУчета = Выборка.Счет; КонецЕсли; КонецЦикла; КонецПроцедуры
Рекламные объявления содержат единственные правдивые сведения, которые можно найти в газетах.