3

Создание обработки заполнения табличной части 1С 8

#1С Предприятие 8#Обычное приложение#1С Бухгалтерия 2.0#Документ#Конфигуратор


1. Постановка задачи

В этой статье рассмотрим процесс написания простейшей внешней обработки заполнения табличной части в 1С 8 для конфигураций, использующих обычное приложение. Для примера возьмем такую задачу: “В конфигурации 1С:Бухгалтерия 2.0 создать внешнюю обработку заполнения табличной части Товары документа Реализация товаров и услуг, данные для заполнения взять из табличной части Товары документа Поступление товаров и услуг”. Таким образом нам необходимо заполнить товары реализации на основании товаров поступления, такая задача довольно часто встречается в реальной практике программиста 1С.

2. Создание внешней обработки

Зайдем в 1С 8 в режиме Конфигуратор. При помощи меню Файл -> Новый или пиктограммы Новый документ создадим новую внешнюю обработку.

Пиктограмма Новый документ в 1С 8

В поле Имя укажем: “ПростейшееЗаполнениеТабличнойЧасти” и сохраним внешнюю обработку на жесткий диск используя меню Файл -> Сохранить или пиктограмму Сохранить или сочетание клавиш Ctrl + S.

Пиктограмма Сохранить в 1С 8

Выделив ветку Реквизиты в дереве метаданных обработки и нажав кнопку Добавить(кнопка с зеленым плюсом) создадим новый реквизит внешней обработки - ДокументПоступления, выберем для него тип ДокументСсылка.ПоступлениеТоваровУслуг, этот реквизит нужен нам для выбора документа Поступление товаров и услуг, на основании которого будет заполняться реализация.

Создание реквизита внешней обработки

Для выбора документа поступления нам понадобится отдельная форма. Выделив ветку Формы и используя ту же кнопку - Добавить создадим форму внешней обработки. Откроется окно конструктора формы , на первой странице конструктора никаких изменений делать не нужно, поэтому просто нажмем кнопку Далее.

Конструктор формы обработки.jpg

На второй странице конструктора нам необходимо выбрать реквизит ДокументПоступления(для того что бы он появился на создаваемой форме) и нажать кнопку Готово.

Конструктор формы обработки. Добавление реквизитов на форму

После этого откроется созданная форма, нам необходимо что бы на ней пользователь выбирал документ поступления, и закрывал ее. Поэтому при нажатии кнопки Выполнить форма должна просто закрываться. Для того что бы реализовать это, выделим кнопку Выполнить, кликнем по ней правой кнопкой мыши и выберем пункт Свойства. В свойствах кнопки, в строке Действие выберем действие - Закрыть. На этом работа с формой завершена, закроем ее.

Выбор действия для кнопки формы

3. Программирование

Приступим к программированию обработки заполнения табличной части. Перейдем в Модуль объекта внешней обработки(на нижней панели обработки кнопка Действия -> Открыть модуль объекта).

Переход в модуль объекта внешней обработки

В нем нам необходимо создать экспортную процедуру Инициализировать.

Процедура Инициализировать(Объект, ИмяТабличнойЧасти = Неопределено, ТабличноеПолеОбъекта = Неопределено) Экспорт
КонецПроцедуры

Обратите внимание, что процедура Инициализировать, а так же все ее параметры, являются обязательными для внешней обработки заполнения табличной части, если вы ее не создадите или не укажите все параметры, ваша обработка просто не будет работать.

Теперь приступим к написанию программного кода. В первую очередь создадим переменную для табличной части документа Реализация товаров и услуг, которую мы будем заполнять.

ТабличнаяЧасть = Объект[ИмяТабличнойЧасти];

При выполнении процедуры в параметре Объект будет содержаться объект документа, который мы заполняем, а в параметре ИмяТабличнойЧасти строка с именем табличной части, которую мы заполняем. Таким образом эта строчка кода получает табличную часть заполняемого документа по ее имени.

Нам необходимо что бы пользователь выбрал документ Поступление товаров и услуг, поэтому напишем код открытия формы выбора документа. Для начала получим эту форму в переменную, используя метод внешней обработки ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>). Нам достаточно заполнить только первый параметр этого метода, передав туда строку с именем нашей формы.

ФормаВыбораПоступления = ПолучитьФорму("Форма");

Теперь откроем полученную форму, используя модальное открытие(пока форма открыта все остальные окна 1С недоступны), потому что при таком способе открытия дальнейший наш код в процедуре Инициализировать выполняться не будет, пока пользователь не закроет форму.

ФормаВыбораПоступления.ОткрытьМодально();

После того, как пользователь закроет форму нам необходимо проверить, заполнен ли реквизит ДокументПоступления(на случай если документ поступления не был выбран). Если после проверки ДокументПоступления окажется пустым, то дальнейшее выполнение обработки не имеет смысла, и его следует прервать.

Если НЕ ЗначениеЗаполнено(ДокументПоступления) Тогда
    Сообщить("Не выбран документ поступления");
Возврат;
КонецЕсли;

Для проверки заполненности реквизита здесь используется функция глобального контекста ЗначениеЗаполнено(<Значение>), она проверяет отличатся ли значение переданное в параметре от значения по умолчанию того же типа. Процедура Сообщить выводит указанный текст в окно сообщений 1С 8. Ключевое слово Возврат прерывает выполнение процедуры.

Приступим к написанию запроса, который будет выбирать данные табличной части Товары документа Поступление товаров и услуг. Создадим новый запрос:

Запрос = Новый Запрос;

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

Запрос.УстановитьПараметр("ДокументПоступления",ДокументПоступления);

Напишем текст запроса, будем делать это при помощи Конструктора запроса. Писать текст запроса вручную не рекомендуется, это не эффективно и отнимает кучу времени. Для начала напишем строку:

Запрос.Текст = "";

Поставим курсор между символами кавычек, нажмем правую кнопку мыши и выберем пунк Конструктор запроса…. После этого появится предложение создать новый запрос, нажмем кнопку “ОК”. Откроется окно конструктора, в левой его части расположены все доступные таблицы базы данных, нам необходим документ ПоступлениеТоваровУслуг. Найдем его и раскроем при помощи символа “+”, выберем табличную часть Товары и перетащим ее во вторую часть экрана конструктора, которая называется Таблицы(Также переместить нужную таблицу можно при помощи кнопки “>”).

Выбор табличной части в запросе 1С

Теперь раскроем по “+” выбранную нами таблицу(ПоступлениеТоваровУслугТовары) и перетащим необходимые для нашего заполнения табчасти поля в третью часть экрана конструктора, которая так и называется - Поля. Все доступные поля выбирать не будем, ограничимся таким набором: Номенклатура, Количество, Цена, Сумма, СтавкаНДС, СуммаНДС.

Выбор полей таблицы в конструкторе запроса 1С

Так как нам нужны данные только одного документа поступления(который мы выбрали перед началом заполнения), то в на закладке “Условия” наложим условие на ссылку документа при помощи переданного нами параметра.

 Создание условия в запросе 1С

Создание текста запроса в конструкторе на этом завершено, нажмем кнопку “ОК”. В итоге у нас получился следующий текст запроса:

Запрос.Текст = "ВЫБРАТЬ
|   ПоступлениеТоваровУслугТовары.Номенклатура,
|   ПоступлениеТоваровУслугТовары.Количество,
|   ПоступлениеТоваровУслугТовары.СтавкаНДС,
|   ПоступлениеТоваровУслугТовары.Сумма,
|   ПоступлениеТоваровУслугТовары.СуммаНДС,
|   ПоступлениеТоваровУслугТовары.Цена
|ИЗ
|   Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
|ГДЕ
|   ПоступлениеТоваровУслугТовары.Ссылка = &ДокументПоступления";

Созданный запрос осталось только выполнить и выгрузить в переменную:

Результат = Запрос.Выполнить().Выгрузить();

В переменной Результат хранится таблица значений со строками табличной части Товары выбранного нами документа Поступление товаров и услуг. Теперь можно приступать к заполнению табличной части Товары нашей реализации. Но прежде чем заполнять данные следует ее очистить, на тот случай если там уже есть какие-то строки.

ТабличнаяЧасть.Очистить();

При помощи цикла Для каждого обойдем таблицу значений с результатами запроса.

Для Каждого ЭлементРезультата из Результат Цикл
КонецЦикла;

В этом цикле создадим и заполним строки табличной части документа Реализация товаров и услуг. Создать новую строку мы можем при помощи переменной ТабличнаяЧасть, через которую можно совершать с ней любые действия.

НоваяСтрокаТЧ = ТабличнаяЧасть.Добавить();

Заполним созданную строку таб. части данными из строки результата запроса используя процедуру Глобального контекста - ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>).

ЗаполнитьЗначенияСвойств(НоваяСтрокаТЧ,ЭлементРезультата);

Но заполненных нами данных не достаточно, для того что бы документ провелся, необходимо заполнить еще счета учета номенклатуры. Для этого воспользуемся экспортной

процедурой ЗаполнитьСчетаУчетаВСтрокеТабЧасти из модуля объекта документа Реализация товаров и услуг. Вызовем ее при помощи параметра Объект(следует заметить,

что мы можем вызывать только экспортные процедуры из модуля объекта документа).

Объект.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(НоваяСтрокаТЧ, ИмяТабличнойЧасти, Истина);

На этом программирование заполнения табличной части для 1С 8 завершено. Обработку можно использовать. Полный текст процедуры Инициализировать, выглядит так:

Процедура Инициализировать(Объект, ИмяТабличнойЧасти = Неопределено, ТабличноеПолеОбъекта = Неопределено) Экспорт

    ТабличнаяЧасть = Объект[ИмяТабличнойЧасти];

    ФормаВыбораПоступления = ПолучитьФорму("Форма");
    ФормаВыбораПоступления.ОткрытьМодально();

    Если НЕ ЗначениеЗаполнено(ДокументПоступления) Тогда
        Сообщить("Не выбран документ поступления");
        Возврат;
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ДокументПоступления",ДокументПоступления);

    Запрос.Текст = "ВЫБРАТЬ
    |   ПоступлениеТоваровУслугТовары.Номенклатура,
    |   ПоступлениеТоваровУслугТовары.Количество,
    |   ПоступлениеТоваровУслугТовары.СтавкаНДС,
    |   ПоступлениеТоваровУслугТовары.Сумма,
    |   ПоступлениеТоваровУслугТовары.СуммаНДС,
    |   ПоступлениеТоваровУслугТовары.Цена
    |ИЗ
    |   Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
    |ГДЕ
    |   ПоступлениеТоваровУслугТовары.Ссылка = &ДокументПоступления";

    Результат = Запрос.Выполнить().Выгрузить();

    ТабличнаяЧасть.Очистить();

    Для Каждого ЭлементРезультата из Результат Цикл
        НоваяСтрокаТЧ = ТабличнаяЧасть.Добавить();

        ЗаполнитьЗначенияСвойств(НоваяСтрокаТЧ,ЭлементРезультата);

        Объект.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(НоваяСтрокаТЧ, ИмяТабличнойЧасти, Истина);
    КонецЦикла;
КонецПроцедуры

В следующей части стать будет рассказано, как отладить обработку заполнения табличной части и как подключить ее к документу.

4. Отладка

Довольно часто требуется отлаживать код, который вы пишите. Для того что бы отладить обработку заполнения табличной части в 1С 8 создадим у нее реквизит СсылкаНаОбъект типа ДокументСсылка.РеализацияТоваровУслуг

Реквизит для отладки 1С8

Он нужен нам для того что бы при отладке выбрать документ реализации, который мы будем заполнять. Далее необходимо создать форму для отладки и разместить там созданный реквизит СсылкаНаОбъект, процесс создания формы отладки не отличается от создания формы выбора документа поступления, поэтому детально останавливаться на нем не будем.

Форма отладки заполнения табличной части 1С 8

После того как форма будет создана, перейдем в ее модуль. Там найдем автоматически созданную процедуру КнопкаВыполнитьНажатие. Эта процедура отрабатывает при нажатии кнопки Выполнить. Вызовем из нее процедуру Инициализировать, которая находится в модуле обработки, в параметры передадим объект документа Реализация товаров и услуг(который мы получим из реквизита СсылкаНаОбъект) и строку с названием заполняемой табличной части(в нашем случае Товары).

Процедура КнопкаВыполнитьНажатие(Кнопка)
    Инициализировать(СсылкаНаОбъект.ПолучитьОбъект(), "Товары");
КонецПроцедуры

Теперь необходимо сделать созданную форму основной формой обработки. Для этого выберем ее в поле “Форма обработки”.

Выбор основной формы обработки

Теперь вы можете ставить точку останова в нужном месте процедуры Инициализировать или процедуры КнопкаВыполнитьНажатие формы отладки, и запускать обработку заполнения табличной части в режиме отладки 1С:Предприятия.

5. Подключение к документу

После того как обработка заполнения написана и отлажена следует подключить ее к документу из которого она будет выполняться. Для этого зайдем в 1С 8 в режиме Предприятие, перейдем в меню Сервис -> Дополнительные отчеты и обработки -> Дополнительные внешние обработки табличных частей и добавим новый элемент справочника. При помощи кнопки Заменить файл внешней обработки добавим файл созданной нами обработки заполнения табличной части.

Добавление файла внешней обработки в 1С

Заполним принадлежность обработки, для этого воспользовавшись кнопкой Подбор выберем документ Реализация товаров и услуг

Выбор принадлежности внешней обработки

И укажем, что заполнение предназначено для табличной части Товары.

Выбор табличной части для заполнения

Нажимаем кнопку ОК и на этом все, обработка заполнения будет доступна в меню Заполнить табличной части Товары документа Реализация товаров и услуг. Скачать обработку использованную для этого примера вы можете внизу статьи.

3 69191 17
ДобавленоVital768 дней назад
Последняя активность36 дней назад


Добавить комментарий

Аноним написал:571 день назад0

Добрый день на основании данной статьи пытался сделать обработку заполнения табличной части инвентарь и хоз принадлежности для документа передача материалов в эксплуатацию на основании документа перемещения.

Процедура Инициализировать(Объект, ИмяТабличнойЧасти = Неопределено, ТабличноеПолеОбъекта = Неопределено) Экспорт

ТабличнаяЧасть = Объект[ИмяТабличнойЧасти];

ФормаВыбораПеремещения = ПолучитьФорму(“ФормаДокумента”);

ФормаВыбораПеремещения.ОткрытьМодально();

Если НЕ ЗначениеЗаполнено(ДокументПеремещения) Тогда Сообщить(“Не выбран документ перемещения”); Возврат; КонецЕсли;

Запрос = Новый Запрос; Запрос.УстановитьПараметр(“ДокументПеремещения”,ДокументПеремещения);

Запрос.Текст = “ВЫБРАТЬ | ПеремещениеТоваровТовары.Номенклатура, | ПеремещениеТоваровТовары.Количество |ИЗ | Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары |ГДЕ | ПеремещениеТоваровТовары.Ссылка = &ДокументПеремещения”;

Результат = Запрос.Выполнить().Выгрузить();

ТабличнаяЧасть.Очистить();

Для Каждого ЭлементРезультата из Результат Цикл

НоваяСтрокаТЧ = ТабличнаяЧасть.Добавить();

ЗаполнитьЗначенияСвойств(НоваяСтрокаТЧ,ЭлементРезультата);

Объект.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(НоваяСтрокаТЧ, ИмяТабличнойЧасти, Истина);

КонецЦикла;

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


После подключения обработки выдает:

Заполнение ТЧ не произведено! Метод объекта не обнаружен (Инициализировать)

Ответить

Кирилл написал:562 дня назад0

Очень похоже что “Инициализировать” находится не в модуле объекта. Проверьте этот момент

Ответить

Аноним написал:381 день назад0

Спасибо, прекрасно работает

Ответить

Аноним написал:347 дней назад0

Здравствуйте, а если нужно создать документ “Реализация товаров и услуг” (интересует табличная часть “Товары”) в одной базе на основании документа “Поступление товаров и услуг” другой базы. Надо как-то синхронизировать номенклатуру этих баз, если такая есть, то подставлять, если нет - создавать новую. Подскажите, пожалуйста, как лучше это сделать?

Ответить

Кирилл написал:337 дней назад0

Доброго дня!

Первый этап - синхронизировать номенклатуру между базами… Можно по кодам, наименованиям или же создать регистр соответствий… Там целая наука, в двух словах не рассказать.

Второй этап - подключение к другой базе и получение информации. В вашем случае скорее всего проще всего реализовать через ком-соединение. Вначале получать список документов, что бы пользователь выбрал нужный. Затем из выбранного документа забирать табличную часть.

В общем, задача не такая простая, как может показаться.

Ответить

Аноним написал:329 дней назад0

Доброго времени суток! Для Документа КорректировкаЗаписейРегистров (УПП) не совсем работает. Параметры в процедуру Инициализировать() передаются другие. Как Вы прокомментируете данную ситуацию? Почему нельзя указать заполняемую ТЧ?

Ответить

Кирилл написал:322 дня назад0

Доброго времени.

Дело в том, что в документах “Операция” и “Корректировка регистров” вы видите не табличную часть документа, а записи выбранного регистра.

Если вам нужно заполнить “табличную часть” таких документов, вам надо обращаться к свойству документа “Документ.Объект.Движения”.

Ответить

Аноним написал:313 дней назад0

Добрый вечер. Создал процедуру Инициализировать(), подключил к документу. Процедура срабатывает. Однако внутри процедуры есть вызовы функций, которые также расположены в модуле объекта. Вот эти функции и не вызываются. Подскажите, пожалуйста, можно ли решить данную проблему.

Ответить

Кирилл написал:311 дней назад0

Добрый!

Скопировать процедуры/функции в данный модуль

Ответить

Аноним написал:229 дней назад0

Огромное спасибо!

Ответить

Аноним написал:205 дней назад0

Спасибо! Очень помогли!

Ответить

Аноним написал:191 день назад0

Большое спасибо! Очень помогли!

Ответить

Аноним написал:191 день назад0

Добрый день!

Пытаюсь сделать как у вас. Как обработка - работает. Но как дополнительная внешняя обработка по заполнению табличных частей - не работает.

Выдает сообщения: Заполнение ТЧ не произведено! Недостаточно фактических параметров

И не могу понять - где ей не хватает фактических параметров?

И еще вопрос: для отладки мы создали Форму1 и ее назначили основной. А когда мы подключаем обработку как дополнительную внешнюю обработку по заполнению табличных частей - в качестве основной формы должна быть выбрана форма Форма?

Спасибо!

Ответить

Аноним написал:182 дня назад0

Здравствуйте, Создала обработку в которую из Excel добавляются данные (в её табличную часть). Теперь мне надо сравнить данные обработки и справочника Номенклатура по полям PLU и Штрихкод. Те данные (названия товаров), которые есть в базе 1с отобразить в поле обработки Наименование (т.е. должны в этом поле отобразиться названия, которые нашлись по PLU или штрихкоду). Подскажите, пожалуйста, как это сделать!!!!!!!

Ответить

Аноним написал:170 дней назад0

Доброго времени суток, подскажите пожалуйста, можно ли в 1С 8 КОРП запрограммировать личную карточку работника по спец.одежде, с датами выдачи, планового списания и сроком полезного использования?

Ответить

Аноним написал:128 дней назад0

Спасибо, все работает!!!

Ответить

Аноним написал:36 дней назад0

В модуле формы прописываю

Док = Выб.Ссылка.ПолучитьОбъект().Скопировать();
        Док.СуммаВключаетНДС = Истина;
        Док.Дата = Стр.ДокументПоступления.Дата;
        Док.Склад = СкладТрансфертов;
        Док.товары.Очистить();
        Док.Услуги.Очистить();
        Док.Товары.Загрузить(Стр.ДокументПоступления.Товары.Выгрузить());
        Для каждого СтрТовар из Док.Товары Цикл
            Инициализировать(Док, СтрТовар, "Товары", Истина);
        КонецЦикла;   
        Док.Комментарий = "Создан автоматически";

В модуле объекта

Процедура Инициализировать(Док, СтрТовар, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт

    Док.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(СтрТовар, "Товары", Истина);

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

Программа выдает ошибку: Метод объекта не обнаружен (ЗаполнитьСчетаУчетаВСтрокеТабЧасти).

Ответить

Добавить комментарий

Добавить статью!

Наш канал на Youtube

Изучаете 1С? Скачайте 200 видео по 1С бесплатно:

Похожее

Создание печатной формы в 1с 8

1. Задача Рассмотрим написание простейшей печатной формы в 1с 8.1 - 8.2 на прим...

Создание внешнего отчета в 1с 8

Рассмотрим создание внешнего отчета в 1с 8 без использования системы компоновки ...

Создание печатной формы для управляемого приложения в 1с 8.3

1. Задача Рассмотрим написание простейшей печатной формы в 1с 8.2 - 8.3 для упр...

Подключение внешней обработки, печатной формы, отчета в 1С

Для использования внешних (подключаемых) обработок, отчетов, печатных форм, нет ...

Настройка двухстороннего обмена данными между конфигурациями "Управление торговлей 10.3" и "Бухгалтерия предприятия 2.0" в 1С 8

В этой статье мы рассмотрим как настроить двухсторонний обмен данными между конф...

Новое

Timberland 6 дюймов Премиум Сапоги мужские гуммигут [Timberland_SL26103136] - $105.00 : Timberland outlet, timberlandoutlet.cn

Timberland 6 дюймов Timberland Дети сапоги на выходе [b][url=http://www.timberla...

Lady-Datejust

Rolex Submariner Rolex Submariner [b][url=http://www.rolexdaytona.top/ru/]swiss ...

Колумбийский спортивная одежда outletstoreTERTIARY_SECTIONcolumbiaoutdooroutletstore.top

Колумбия куртки Колумбия куртки [b][url=http://www.columbiaoutdooroutletstore.to...