Здесь мы научимся создавать внешнюю обработку заполнения табличной части документа в 1С 8.3 (для управляемых форм) с нуля. Рассмотренный пример обработки можно скачать по ссылке.
Возьмем самой простой пример: в табличной части «Материалы» документа «Требование-накладная» присвоим во всех строках количеству значение равное 100.
Подготовка внешней обработки в 1С 8.3
Итак, создаем внешнюю обработку. Сохраняем ее на диск.
Внешнюю обработку или отчет в базе 1С необходимо зарегистрировать. Делается это с помощью структуры, которая содержится в экспортной функции СведенияОВнешнейОбработке.
По кнопке «Действия» переходим в модель объекта, где и создаем функцию:
Поговорим немного о значении полей.
Вид — в зависимости от предназначения обработки может принимать значения:
- Отчет.
- ЗаполнениеОбъекта.
- Печатная форма.
- Дополнительная обработка.
- СозданиеСвязанныхОбъектов.
- Дополнительный отчет.
В нашем случае для обработки заполнения табличной части нам необходим вид обработки «ЗаполнениеОбъекта»
Назначение — в этом поле перечисляются документы, для которых эта обработка предназначена (в которых она появится после регистрации в информационной базе). Для перечисления этих документов создадим массив «Назначения» и добавим в него документ «ТребованиеНакладная».
Наименование — это наименование будет отображаться в списке дополнительных обработок.
Версия — версия нашего нового программного продукта.
Информация — этот ключ нашей структуры содержит дополнительную информацию о нашей обработке.
Безопасный режим — принимает значение Истина/Ложь. Мы будем использовать безопасный режим.
Команды — этот ключ структуры содержит перечень поставляемых нашей обработкой команд. Для команд мы создадим функцию ПолучитьТаблицуКоманд() и процедуру ДобавитьКоманду().
Немного подробнее остановимся на полях таблицы значений команд.
Представление — это представление команды для пользователя: какое название для него будет представлено в интерфейсе.
Идентификатор — это внутренний идентификатор команды в пределах нашей обработки
Использование — в зависимости от использования команды может принимать значения:
- ВызовСерверногоМетода — из модуля обработки вызывается серверная процедура.
- ОткрытиеФормы — используется для открытия формы обработки.
- ВызовКлиентского метода — для вызова клиентской процедуры из модуля обработки.
- СценарийвБезопасномРежиме — серверная процедура в безопасном режиме.
В нашем случае мы работаем с формой объекта 1С 8.3, поэтому нам необходимо использовать ВызовКлиентскогоМетода для вызова команды внешней обработки.
ПоказыватьОповещение — имеет одно из двух значений: Истина/Ложь.
Модификатор — дополнительный модификатор команды. Итоговый листинг нашей обработки в модуле объекта приобретает следующий вид:
Получите 267 видеоуроков по 1С бесплатно:
Создание команды для заполнения табличной части
В поле Форма обработки нажмем линзу, чтобы создать форму:
В форме добавим команду ВыполнитьКоманду.
В теле обработки заполнение команды обратимся к данным формы через ВладелецФормы и изменим значение количества в табличной части материалов:
Регистрация внешней обработки в 1С 8.3 и её проверка
Теперь в режиме предприятия 1С зарегистрируем нашу внешнюю обработку для заполнения табличной части:
В списке внешних обработок нажмем кнопку Создать:
В открывшемся бланке новой внешней обработки загрузим из файла внешнюю обработку и впоследствии запишем новую обработку:
Теперь в документе «Требование-накладная» мы можем наблюдать результат регистрации нашей обработки в информационной базе. А по нажатию кнопки «Заполнить документ» увидим работу нашей обработки по заполнению табличной части.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
1. Постановка задачи
В этой статье рассмотрим процесс написания простейшей внешней обработки заполнения табличной части в 1С 8 для конфигураций, использующих обычное приложение. Для примера возьмем такую задачу: “В конфигурации 1С:Бухгалтерия 2.0 создать внешнюю обработку заполнения табличной части Товары документа Реализация товаров и услуг, данные для заполнения взять из табличной части Товары документа Поступление товаров и услуг”. Таким образом нам необходимо заполнить товары реализации на основании товаров поступления, такая задача довольно часто встречается в реальной практике программиста 1С.
2. Создание внешней обработки
Зайдем в 1С 8 в режиме Конфигуратор. При помощи меню Файл -> Новый или пиктограммы Новый документ создадим новую внешнюю обработку.
В поле Имя укажем: “ПростейшееЗаполнениеТабличнойЧасти” и сохраним внешнюю обработку на жесткий диск используя меню Файл -> Сохранить или пиктограмму Сохранить или сочетание клавиш Ctrl + S.
Выделив ветку Реквизиты в дереве метаданных обработки и нажав кнопку Добавить(кнопка с зеленым плюсом) создадим новый реквизит внешней обработки — ДокументПоступления, выберем для него тип ДокументСсылка.ПоступлениеТоваровУслуг, этот реквизит нужен нам для выбора документа Поступление товаров и услуг, на основании которого будет заполняться реализация.
Для выбора документа поступления нам понадобится отдельная форма. Выделив ветку Формы и используя ту же кнопку — Добавить создадим форму внешней обработки. Откроется окно конструктора формы , на первой странице конструктора никаких изменений делать не нужно, поэтому просто нажмем кнопку Далее.
На второй странице конструктора нам необходимо выбрать реквизит ДокументПоступления(для того что бы он появился на создаваемой форме) и нажать кнопку Готово.
После этого откроется созданная форма, нам необходимо что бы на ней пользователь выбирал документ поступления, и закрывал ее. Поэтому при нажатии кнопки Выполнить форма должна просто закрываться. Для того что бы реализовать это, выделим кнопку Выполнить, кликнем по ней правой кнопкой мыши и выберем пункт Свойства. В свойствах кнопки, в строке Действие выберем действие — Закрыть. На этом работа с формой завершена, закроем ее.
3. Программирование
Приступим к программированию обработки заполнения табличной части. Перейдем в Модуль объекта внешней обработки(на нижней панели обработки кнопка Действия -> Открыть модуль объекта).
В нем нам необходимо создать экспортную процедуру Инициализировать.
Обратите внимание, что процедура Инициализировать, а так же все ее параметры, являются обязательными для внешней обработки заполнения табличной части, если вы ее не создадите или не укажите все параметры, ваша обработка просто не будет работать.
Теперь приступим к написанию программного кода. В первую очередь создадим переменную для табличной части документа Реализация товаров и услуг, которую мы будем заполнять.
При выполнении процедуры в параметре Объект будет содержаться объект документа, который мы заполняем, а в параметре ИмяТабличнойЧасти строка с именем табличной части, которую мы заполняем. Таким образом эта строчка кода получает табличную часть заполняемого документа по ее имени.
Нам необходимо что бы пользователь выбрал документ Поступление товаров и услуг, поэтому напишем код открытия формы выбора документа. Для начала получим эту форму в переменную, используя метод внешней обработки ПолучитьФорму( , , ). Нам достаточно заполнить только первый параметр этого метода, передав туда строку с именем нашей формы.
Теперь откроем полученную форму, используя модальное открытие(пока форма открыта все остальные окна 1С недоступны), потому что при таком способе открытия дальнейший наш код в процедуре Инициализировать выполняться не будет, пока пользователь не закроет форму.
После того, как пользователь закроет форму нам необходимо проверить, заполнен ли реквизит ДокументПоступления(на случай если документ поступления не был выбран). Если после проверки ДокументПоступления окажется пустым, то дальнейшее выполнение обработки не имеет смысла, и его следует прервать.
Для проверки заполненности реквизита здесь используется функция глобального контекста ЗначениеЗаполнено( ), она проверяет отличатся ли значение переданное в параметре от значения по умолчанию того же типа. Процедура Сообщить выводит указанный текст в окно сообщений 1С 8. Ключевое слово Возврат прерывает выполнение процедуры.
Приступим к написанию запроса, который будет выбирать данные табличной части Товары документа Поступление товаров и услуг. Создадим новый запрос:
В параметр запроса передадим ссылку на выбранный нами документ поступления, этот параметр понадобится нам для того что бы наложить условие на документ в запросе.
Напишем текст запроса, будем делать это при помощи Конструктора запроса. Писать текст запроса вручную не рекомендуется, это не эффективно и отнимает кучу времени. Для начала напишем строку:
Поставим курсор между символами кавычек, нажмем правую кнопку мыши и выберем пунк Конструктор запроса…. После этого появится предложение создать новый запрос, нажмем кнопку “ОК”. Откроется окно конструктора, в левой его части расположены все доступные таблицы базы данных, нам необходим документ ПоступлениеТоваровУслуг. Найдем его и раскроем при помощи символа “+”, выберем табличную часть Товары и перетащим ее во вторую часть экрана конструктора, которая называется Таблицы(Также переместить нужную таблицу можно при помощи кнопки “>”).
Теперь раскроем по “+” выбранную нами таблицу(ПоступлениеТоваровУслугТовары) и перетащим необходимые для нашего заполнения табчасти поля в третью часть экрана конструктора, которая так и называется — Поля. Все доступные поля выбирать не будем, ограничимся таким набором: Номенклатура, Количество, Цена, Сумма, СтавкаНДС, СуммаНДС.
Так как нам нужны данные только одного документа поступления(который мы выбрали перед началом заполнения), то в на закладке “Условия” наложим условие на ссылку документа при помощи переданного нами параметра.
Создание текста запроса в конструкторе на этом завершено, нажмем кнопку “ОК”. В итоге у нас получился следующий текст запроса:
Созданный запрос осталось только выполнить и выгрузить в переменную:
В переменной Результат хранится таблица значений со строками табличной части Товары выбранного нами документа Поступление товаров и услуг. Теперь можно приступать к заполнению табличной части Товары нашей реализации. Но прежде чем заполнять данные следует ее очистить, на тот случай если там уже есть какие-то строки.
При помощи цикла Для каждого обойдем таблицу значений с результатами запроса.
В этом цикле создадим и заполним строки табличной части документа Реализация товаров и услуг. Создать новую строку мы можем при помощи переменной ТабличнаяЧасть, через которую можно совершать с ней любые действия.
Заполним созданную строку таб. части данными из строки результата запроса используя процедуру Глобального контекста — ЗаполнитьЗначенияСвойств( , ).
Но заполненных нами данных не достаточно, для того что бы документ провелся, необходимо заполнить еще счета учета номенклатуры. Для этого воспользуемся экспортной
процедурой ЗаполнитьСчетаУчетаВСтрокеТабЧасти из модуля объекта документа Реализация товаров и услуг. Вызовем ее при помощи параметра Объект(следует заметить,
что мы можем вызывать только экспортные процедуры из модуля объекта документа).
На этом программирование заполнения табличной части для 1С 8 завершено. Обработку можно использовать. Полный текст процедуры Инициализировать, выглядит так:
В следующей части стать будет рассказано, как отладить обработку заполнения табличной части и как подключить ее к документу.
4. Отладка
Довольно часто требуется отлаживать код, который вы пишите. Для того что бы отладить обработку заполнения табличной части в 1С 8 создадим у нее реквизит СсылкаНаОбъект типа ДокументСсылка.РеализацияТоваровУслуг
Он нужен нам для того что бы при отладке выбрать документ реализации, который мы будем заполнять. Далее необходимо создать форму для отладки и разместить там созданный реквизит СсылкаНаОбъект, процесс создания формы отладки не отличается от создания формы выбора документа поступления, поэтому детально останавливаться на нем не будем.
После того как форма будет создана, перейдем в ее модуль. Там найдем автоматически созданную процедуру КнопкаВыполнитьНажатие. Эта процедура отрабатывает при нажатии кнопки Выполнить. Вызовем из нее процедуру Инициализировать, которая находится в модуле обработки, в параметры передадим объект документа Реализация товаров и услуг(который мы получим из реквизита СсылкаНаОбъект) и строку с названием заполняемой табличной части(в нашем случае Товары).
Теперь необходимо сделать созданную форму основной формой обработки. Для этого выберем ее в поле “Форма обработки”.
Теперь вы можете ставить точку останова в нужном месте процедуры Инициализировать или процедуры КнопкаВыполнитьНажатие формы отладки, и запускать обработку заполнения табличной части в режиме отладки 1С:Предприятия.
5. Подключение к документу
После того как обработка заполнения написана и отлажена следует подключить ее к документу из которого она будет выполняться. Для этого зайдем в 1С 8 в режиме Предприятие, перейдем в меню Сервис -> Дополнительные отчеты и обработки -> Дополнительные внешние обработки табличных частей и добавим новый элемент справочника. При помощи кнопки Заменить файл внешней обработки добавим файл созданной нами обработки заполнения табличной части.
Заполним принадлежность обработки, для этого воспользовавшись кнопкой Подбор выберем документ Реализация товаров и услуг
И укажем, что заполнение предназначено для табличной части Товары.
Нажимаем кнопку ОК и на этом все, обработка заполнения будет доступна в меню Заполнить табличной части Товары документа Реализация товаров и услуг. Скачать обработку использованную для этого примера вы можете по ссылке.
Табличные части в документах и справочниках часто бывают достаточно большими — сотни и тысячи строк. Почти также часто требуется выполнять какую-либо обработку этих самых строк и разумеется очень желательно автоматизировать эту обработку. Изменять конфигурацию в каждом подобном случае было бы очень непрактично, поэтому компания «1С» создала механизм внешних обработок табличных частей.
Внешняя обработка табличных частей — это обычная внешняя обработка, соответствующая определенным требованиям. Такую обработку можно подключить к какой-либо типовой конфигурации и привязать к нужным документам и справочникам.
Кроме этого, нужно отметить, что создание внешних обработок табличных частей различается для обычного приложения (Бухгалтерия 2.0.*, ЗиУП 2.5.*, УТ 10.3.*) и управляемого приложения (Бухгалтерия 3.0.*, ЗиУП 3.*, УТ 11.*). В статье будут рассмотрены оба варианта.
Также нужно сказать, что вопросы отладки внешних обработок табличных частей для управляемого и для обычного приложения рассматриваются в отдельной статье.
Внешняя обработка табличных частей в управляемом приложении
Начнем с управляемого приложения. Тут нужно сказать, что в управляемом приложении обработки табличных частей заменены на более общие обработки заполнение объекта. В тексте ниже будет приведен пример создания и подключения обработки заполнения объекта на примере документа «Реализация товаров и услуг» (Бухгалтерия предприятия, редакция 3.0).
Создание
Итак, для начала нам нужно создать новую внешнюю обработку и в модуле объекта этой обработки размещаем такой код:
В коде реализована экспортная функция СведенияОВнешнейОбработке(), она является обязательной и служит для описания внешнего обработки. Обязательными для заполнения являются параметры «Вид» (в нашем случае — «ЗаполнениеОбъекта»), «Версия» и «Команды». Необязательные параметры также очень желательно заполнять — это облегчает подключение и помогает избежать путаницы в дальнейшем.
Параметр «БезопасныйРежим» в значении «Истина» накладывает некоторые ограничения:
- игнорируется привилегированный режим;
- запрещена работа с COM;
- запрещена загрузка внешних компонент;
- запрещен запуск внешних приложений и команд ОС;
- запрещен доступ к файловой системе (кроме временных файлов);
- запрещен доступ к интернету.
При этом имеется возможность запросить исключения из безопасного режима (приме в коже выше).
В примере выше добавляются три команды разного типа. Команды типов «ВызовСерверногоМетода» и «ЗаполнениеФормы» должны быть реализованы в том же самом модуле объекта обработки — экспортная процедура ВыполнитьКоманду(). При этом команды типа «ЗаполнениеФормы» могут выполняться для новых (не записанных) объектов. Пример реализации: