Внешняя обработка табличных частей заполнение реквизитов

Табличные части в документах и справочниках часто бывают достаточно большими — сотни и тысячи строк. Почти также часто требуется выполнять какую-либо обработку этих самых строк и разумеется очень желательно автоматизировать эту обработку. Изменять конфигурацию в каждом подобном случае было бы очень непрактично, поэтому компания «1С» создала механизм внешних обработок табличных частей.

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

Кроме этого, нужно отметить, что создание внешних обработок табличных частей различается для обычного приложения (Бухгалтерия 2.0.*, ЗиУП 2.5.*, УТ 10.3.*) и управляемого приложения (Бухгалтерия 3.0.*, ЗиУП 3.*, УТ 11.*). В статье будут рассмотрены оба варианта.

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

Содержание

  1. Внешняя обработка табличных частей в управляемом приложении
  2. Создание
  3. Подключение
  4. Внешняя обработка табличных частей в обычном приложении
  5. Создание
  6. Подключение

Внешняя обработка табличных частей в управляемом приложении

Начнем с управляемого приложения. Тут нужно сказать, что в управляемом приложении обработки табличных частей заменены на более общие обработки заполнение объекта. В тексте ниже будет приведен пример создания и подключения обработки заполнения объекта на примере документа «Реализация товаров и услуг» (Бухгалтерия предприятия, редакция 3.0).

Создание

Итак, для начала нам нужно создать новую внешнюю обработку и в модуле объекта этой обработки размещаем такой код:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

Функция СведенияОВнешнейОбработке() Экспорт

ПараметрыРегистрации = Новый Структура;

//указываем сведения о внешней печатной форме

ПараметрыРегистрации.Вставить(«Вид», «ЗаполнениеОбъекта»);

ПараметрыРегистрации.Вставить(«Версия», «1.0»);

ПараметрыРегистрации.Вставить(«ВерсияБСП», «3.0.1.287»);

ПараметрыРегистрации.Вставить(«Наименование», «Установка скидок в реализации»);

ПараметрыРегистрации.Вставить(«Информация», «Внешняя обработка заполнения табличной части»);

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

ПараметрыРегистрации.Вставить(«БезопасныйРежим», Истина);

//определим документы и/или справочники

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

ПараметрыРегистрации.Вставить(«Назначение», Новый Массив);

ПараметрыРегистрации.Назначение.Добавить(«Документ.РеализацияТоваровУслуг»);

//используется для дополнительных отчетов

//подключенных к подсисстеме «Варианты отчетов»

ПараметрыРегистрации.Вставить(«ОпределитьНастройкиФормы», Ложь);

//если требуются исключения из безопасного режима их можно запросить

ПараметрыРегистрации.Вставить(«Разрешения», Новый Массив);

ПараметрыРегистрации.Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(«https»,»yandex.ru»,80,»очень надо»));

//определяем таблицу команд

ПараметрыРегистрации.Вставить(«Команды», ПолучитьТаблицуКоманд());

//добавляем команду

//вызов клиентского метода

Команда = ПараметрыРегистрации.Команды.Добавить();

Команда.Представление = «Установить скидку на клиенте»;

Команда.Идентификатор = «УстановитьСкидкуНаКлиенте»;

Команда.Использование = «ВызовКлиентскогоМетода»;

Команда.ПоказыватьОповещение = Истина;

//добавляем команду

//вызов серверного метода

Команда = ПараметрыРегистрации.Команды.Добавить();

Команда.Представление = «Установить скидку на сервере»;

Команда.Идентификатор = «УстановитьСкидкуНаСервере»;

Команда.Использование = «ВызовСерверногоМетода»;

Команда.ПоказыватьОповещение = Истина;

//добавляем команду

//заполнение формы без записи

Команда = ПараметрыРегистрации.Команды.Добавить();

Команда.Представление = «Установить скидку без записи»;

Команда.Идентификатор = «УстановитьСкидкуБезЗаписи»;

Команда.Использование = «ЗаполнениеФормы»;

Команда.ПоказыватьОповещение = Истина;

Возврат ПараметрыРегистрации;

КонецФункции

Функция ПолучитьТаблицуКоманд()

Команды = Новый ТаблицаЗначений;

Команды.Колонки.Добавить(«Представление», Новый ОписаниеТипов(«Строка»));

Команды.Колонки.Добавить(«Идентификатор», Новый ОписаниеТипов(«Строка»));

Команды.Колонки.Добавить(«Использование», Новый ОписаниеТипов(«Строка»));

Команды.Колонки.Добавить(«ПоказыватьОповещение», Новый ОписаниеТипов(«Булево»));

Команды.Колонки.Добавить(«Модификатор», Новый ОписаниеТипов(«Строка»));

Команды.Колонки.Добавить(«ЗаменяемыеКоманды», Новый ОписаниеТипов(«Строка»));

Возврат Команды;

КонецФункции

В коде реализована экспортная функция СведенияОВнешнейОбработке(), она является обязательной и служит для описания внешнего обработки. Обязательными для заполнения являются параметры «Вид» (в нашем случае — «ЗаполнениеОбъекта»), «Версия» и «Команды». Необязательные параметры также очень желательно заполнять — это облегчает подключение и помогает избежать путаницы в дальнейшем.

Параметр «БезопасныйРежим» в значении «Истина» накладывает некоторые ограничения:

  • игнорируется привилегированный режим;
  • запрещена работа с COM;
  • запрещена загрузка внешних компонент;
  • запрещен запуск внешних приложений и команд ОС;
  • запрещен доступ к файловой системе (кроме временных файлов);
  • запрещен доступ к интернету.

При этом имеется возможность запросить исключения из безопасного режима (приме в коже выше).

В примере выше добавляются три команды разного типа. Команды типов «ВызовСерверногоМетода» и «ЗаполнениеФормы» должны быть реализованы в том же самом модуле объекта обработки — экспортная процедура ВыполнитьКоманду(). При этом команды типа «ЗаполнениеФормы» могут выполняться для новых (не записанных) объектов. Пример реализации:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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

Если ИдентификаторКоманды = «УстановитьСкидкуБезЗаписи» Тогда

//для команд типа «ЗаполнениеФормы»

//параметр ОбъектыНазначения не передается

Для Каждого СтрТовары Из ПараметрыВыполнения.ЭтаФорма.Объект.Товары Цикл

СтрТовары.Цена = СтрТовары.Цена*0.9;

СтрТовары.Сумма = СтрТовары.Цена*СтрТовары.Количество;

КонецЦикла;

ИначеЕсли ИдентификаторКоманды = «УстановитьСкидкуНаСервере» Тогда

//для команд типа «ВызовСерверногоМетода»

//параметр ОбъектыНазначения содержит массив объектов

//для которых вызвана команда

Для Каждого ЭлементОбъектНазначения Из ОбъектыНазначения Цикл

ОбъектНазначения = ЭлементОбъектНазначения.ПолучитьОбъект();

Для Каждого СтрТовары Из ОбъектНазначения.Товары Цикл

СтрТовары.Цена = СтрТовары.Цена*0.9;

СтрТовары.Сумма = СтрТовары.Цена*СтрТовары.Количество;

КонецЦикла;

ОбъектНазначения.Записать(РежимЗаписиДокумента.Проведение);

КонецЦикла;

КонецЕсли;

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

Команды типа «ВызовКлиентскогоМетода» должны быть реализованы в модуле основной формы обработки — экспортная процедура ВыполнитьКоманду(). То есть требуется создать форму (можно абсолютно пустую), выбрать эту форму в качестве основной для обработки и уже в модуле этой формы реализовать требуемую процедуру. Пример реализации:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

&НаКлиенте

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

Если ИдентификаторКоманды = «УстановитьСкидкуНаКлиенте» Тогда

Если ВладелецФормы.ИмяФормы

= «Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары» Тогда

ОбъектФормы = ВладелецФормы.Объект;

УстановитьСкидкуНаСервере(ОбъектФормы);

КопироватьДанныеФормы(ОбъектФормы, ВладелецФормы.Объект);

КонецЕсли;

КонецЕсли;

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

&НаСервере

Процедура УстановитьСкидкуНаСервере(Объект)

Для Каждого СтрТовары Из Объект.Товары Цикл

СтрТовары.Цена = СтрТовары.Цена*0.9;

СтрТовары.Сумма = СтрТовары.Цена*СтрТовары.Количество;

КонецЦикла;

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

Выбор типа команды в первую очередь зависит от конкретной задачи.

Подключение

Подключение внешней обработки покажем на примере «Бухгалтерии предприятия, редакция 3.0».

Вкратце повторю основные этапы:

  1. Открываем вкладку «Администрирование» и переходим в раздел «Печатные формы, отчеты и обработки»;
  2. Устанавливаем галку «Дополнительные отчеты и обработки» и переходим в раздел «Дополнительные отчеты и обработки»;
  3. Жмем кнопку «Добавить из файла» и выбираем файл обработки;
  4. (Необязательно) Меняем наименование, комментарии, настраиваем видимость, изменяем размещение;
  5. Жмем кнопку «Записать и закрыть».

Внешняя обработка табличных частей в обычном приложении

Теперь создадим обработку табличных частей для обычного приложения — на примере документа «Реализация товаров и услуг» (Бухгалтерия предприятия, редакция 2.0).

Создание

В обычном приложении все гораздо проще — нам просто нужно создать обработку и в модуле объекта этой обработки реализовать экспортную процедуру Инициализировать(), которая имеет следующие параметры:

  • Объект — объект (документ или справочник) для которого произошел  вызов внешней обработки;
  • ИмяТабличнойЧасти — имя табличной части, для которой вызвана обработка;
  • ТабличноеПоле — табличное поле формы (элемент формы), для которого вызвана обработка.

Пример реализации:

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

Если ИмяТабличнойЧасти = «Товары» Тогда

Для Каждого СтрТовары Из Объект.Товары Цикл

СтрТовары.Цена = СтрТовары.Цена*0.9;

СтрТовары.Сумма = СтрТовары.Цена*СтрТовары.Количество;

КонецЦикла;

КонецЕсли;

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

Кроме этого внешняя обработка табличных частей может содержать макет с названием «Параметры_Авторегистрации». Как следует из названия в этом макете можно указать параметры для автоматической регистрации внешней обработки ТЧ. Для этого в первой колонке нужно перечислить объекты метаданных, а во второй соответствующие названия табличных частей, например так:

Параметры_Авторегистрации

Параметры_Авторегистрации

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

Подключение

Подключим нашу внешнюю обработку табличных частей на примере «Бухгалтерии предприятия, редакция 2.0».

Основные этапы:

  1. Открываем справочник внешних обработок ТЧ (Сервис->Дополнительные отчеты и обработки->Дополнительные внешние обработки табличных частей);
  2. Добавляем новый элемент справочника и указываем файл обработки;
  3. Записываем элемент.
  4. (Необязательно) Меняем имеющиеся настройки — представления, отборы, дополнительные параметры и прочее.

На этом все, надеюсь, что эта статья была Вам полезна.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка…

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

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

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

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

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

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

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.

Связаться с нами можно по телефону +7 499 350 29 00.

Услуги и цены можно увидеть по ссылке.

Будем рады помочь Вам!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. Отладка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создание простой обработки в 1С 8.3

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

Допустим, что в табличную часть «Товары» документа «ПоступлениеТоваровУслуг» добавили реквизит «Назначение», которое должно проставляться при выборе склада. Естественно, перевыбирать склад во всех существующих документах никто не собирается, и принимается решение, что нужна внешняя обработка заполнения табличной части документа. Алгоритм наших действий следующий:

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

У этого способа есть недостаток – обработка не сохраняется в конфигурации. То есть, если через некоторое время добавят новый реквизит, то снова придется ее найти, адаптировать и открыть через основное меню. Но такие ситуации достаточно редки, так как перед вводом системы в эксплуатацию идет тщательный аудит с составлением списка нужных реквизитов. Гораздо более распространены ситуации, когда пользователям необходимо в процессе работы править данные в строках, например, изменять количество.

Добавление в ИБ дополнительной обработки

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

  • ЗаполнениеОбъекта;
  • ДополнительнаяОбработка;
  • СозданиеСвязанныхОбъектов;
  • ПечатнаяФорма;
  • Отчет;
  • ДополнительныйОтчет.

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

Рис.6 Заполнение данных обработки
Рис.6 Заполнение данных обработки

На следующем шаге создаем в модуле объекта внешней обработки процедуру для определения типа функционала. Она типичная для всех дополнительных обработок и отчетов, подключаемых к 1С 8.3, с небольшими отличиями в зависимости от вида. В качестве основных настроек используются следующие пункты:

  1. Вид – указывается 1 из вышеперечисленных вариантов;
  2. МасНазначений – массив, включающий в себя все объекты конфигурации, на которые предполагается добавить новый функционал;
  3. Наименование – как будет называться наша доработка в общем списке;
  4. БезопасныйРежим – ограничение определенных действий для обработки;
  5. Команды – список кнопок, которые появятся в объектах, перечисленных в МасНазначений.

 Функция СведенияОВнешнейОбработке() Экспорт
        	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.1.3.1");
        	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();  //ВидОбработкиПечатнаяФорма();
        	МасНазначений = Новый Массив;
        	МасНазначений.Добавить("Документ.ЗаказНаПеремещение");
        	МасНазначений.Добавить("Документ.ЗаказПоставщику");
        	
        	ПараметрыРегистрации.Назначение = МасНазначений;
        	ПараметрыРегистрации.Наименование = "ДобавитьКоличество";
        	ПараметрыРегистрации.БезопасныйРежим = Ложь;
        	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
        	НоваяКоманда.Представление = НСтр("ru = 'ДобавитьКоличество'");
        	НоваяКоманда.Идентификатор = "ДобавитьКоличество";
        	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
        	НоваяКоманда.ПоказыватьОповещение = Истина;
        	Возврат ПараметрыРегистрации;
КонецФункции

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


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) экспорт
Для каждого стр из ВладелецФормы.Объект.Товары цикл
        	стр.Количество = стр.Количество + 10;	
        	стр.КоличествоУпаковок = стр.КоличествоУпаковок + 10; 	
КонецЦикла;
КонецПроцедуры

После сохранения внешней обработки нам остается только подключить ее в базу 1С в режиме предприятия. Запускаем 1С, заходим в раздел «НСИ и администрирование», «Печатные формы, отчеты и обработки». Открываем форму «Дополнительные отчеты и обработки» и перед нами открывается список всех подключенных объектов.

Рис.7 НСИ и администрирование
Рис.7 НСИ и администрирование

Нажав «Добавить из файла…», выбираем сохраненный файл, и 1С при помощи процедуры «СведенияОВнешнейОбработке» подгружает всю информацию. Нам лишь остается сохранить данные и зайти в документы, чтобы проверить результат работы. Так как в коде описаны действия на стороне клиента, чтобы данные попали в базу, необходимо провести документ после изменения количества.

Рис.8 Проведение документа
Рис.8 Проведение документа

Грамотно применяя все возможности платформы и библиотеки стандартных подсистем 1С, можно существенно облегчить труд пользователей и избежать множества проблем. Программное заполнение объектов информационной базы может помочь во внедрении, но нужно быть внимательным и тщательно тестировать добавленные возможности.

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

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

Создадим новую обработку через конфигуратор.

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

Функция СведенияОВнешнейОбработке() Экспорт
	
	Назначения = Новый Массив();
	Назначения.Добавить("Документ.ТребованиеНакладная");
	
	ПараметрыРегистрации = Новый Структура();
	ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
	ПараметрыРегистрации.Вставить("Назначение", Назначения);
	ПараметрыРегистрации.Вставить("Наименование", "Заполнить по остаткам");
	ПараметрыРегистрации.Вставить("Версия", "1.0");
	ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка табличной части требования-накладной");
	ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
	
	Команды = ПолучитьТаблицуКоманд() ;
	ДобавитьКоманду(Команды, "Заполнить документ", "ЗаполнитьДокумент", "ВызовКлиентскогоМетода", Ложь, "");
	
	ПараметрыРегистрации.Вставить("Команды",Команды) ;
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
	НоваяКоманда = ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление = Представление;
	НоваяКоманда.Идентификатор = Идентификатор;
	НоваяКоманда.Использование = Использование;
	НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
	НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры	

Эти процедуры используются при добавлении обработки в систему. Для информации, описание значений «параметров регистрации»:

Вид — в зависимости от предназначения обработки может принимать значения:

  • Отчет
  • ЗаполнениеОбъекта
  • Печатная форма
  • Дополнительная обработка
  • СозданиеСвязанныхОбъектов
  • Дополнительный отчет

В нашем случае для обработки заполнения табличной части нам необходим вид обработки «ЗаполнениеОбъекта»

Назначение — в этом поле перечисляются документы, для которых эта обработка предназначена (в которых она появится после регистрации в информационной базе). Для перечисления этих документов создадим массив «Назначения» и добавим в него документ «ТребованиеНакладная».

Наименование — это наименование будет отображаться в списке дополнительных обработок.

Версия — версия нашего нового программного продукта.

Информация — этот ключ нашей структуры содержит дополнительную информацию о нашей обработке.

Безопасный режим — принимает значение Истина/Ложь. Мы будем использовать безопасный режим.

Команды — этот ключ структуры содержит перечень поставляемых нашей обработкой команд. Для команд мы создадим функцию ПолучитьТаблицуКоманд() и процедуру ДобавитьКоманду().

Немного подробнее остановимся на полях таблицы значений команд.

Представление — это представление команды для пользователя: какое название для него будет представлено в интерфейсе.

Идентификатор — это внутренний идентификатор команды в пределах нашей обработки

Использование — в зависимости от использования команды может принимать значения:

  • ВызовСерверногоМетода — из модуля обработки вызывается серверная процедура.
  • ОткрытиеФормы — используется для открытия формы обработки.
  • ВызовКлиентского метода — для вызова клиентской процедуры из модуля обработки.
  • СценарийвБезопасномРежиме — серверная процедура в безопасном режиме.

В нашем случае мы работаем с формой объекта 1С 8.3, поэтому нам необходимо использовать ВызовКлиентскогоМетода для вызова команды внешней обработки.

ПоказыватьОповещение — имеет одно из двух значений: Истина/Ложь.
Модификатор — дополнительный модификатор команды.

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

В открывшейся форме добавим процедуры полезного действия, цель — добавлять в табличную часть остатки по счету 10.Х:

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
	Счет = ПредопределенноеЗначение("ПланСчетов.Хозрасчетный.Материалы");
	
	ОписаниеЗавершениеСчет = Новый ОписаниеОповещения("ВыборСчетаЗавершение", ЭтотОбъект);
	ПоказатьВводЗначения(ОписаниеЗавершениеСчет, Счет, "Счет");	
	
КонецПроцедуры

&НаКлиенте
Процедура ВыборСчетаЗавершение(Значение, ДопПараметры) Экспорт 
	Если ЗначениеЗаполнено(Значение) Тогда
		Дата = ?(ЗначениеЗаполнено(ВладелецФормы.Объект.Дата), ВладелецФормы.Объект.Дата, ТекущаяДата());
		Строки = ЗаполнитьНаСервере(Значение, ВладелецФормы.Объект.Склад, ВладелецФормы.Объект.Организация, Дата);		
		
		Для каждого Строка Из Строки Цикл
			НоваяСтрока = ВладелецФормы.Объект.Материалы.Добавить();			
			ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
			//Сообщить("Добавлен "+строка.Номенклатура+", "+Строка.Количество);
		КонецЦикла;
		
		ВладелецФормы.ОбновитьОтображениеДанных();
	КонецЕсли;			
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗаполнитьНаСервере(Счет,Склад,Организация,Дата)
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Счет", Счет);
	Запрос.УстановитьПараметр("Склад", Склад);
	Запрос.УстановитьПараметр("Организация", Организация);
	Запрос.УстановитьПараметр("Дата", Дата);
	
	ТекстЗапроса = "ВЫБРАТЬ
	               |	ХозрасчетныйОстатки.Счет КАК Счет,
	               |	ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
	               |	ХозрасчетныйОстатки.Субконто3 КАК Субконто3,
	               |	ХозрасчетныйОстатки.Организация КАК Организация,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК КоличествоОстаток,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоОстатокДт) КАК КоличествоОстатокДт,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоОстатокКт) КАК КоличествоОстатокКт,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоРазвернутыйОстатокДт) КАК КоличествоРазвернутыйОстатокДт,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоРазвернутыйОстатокКт) КАК КоличествоРазвернутыйОстатокКт
	               |ИЗ
	               |	РегистрБухгалтерии.Хозрасчетный.Остатки(
	               |			&Дата,
	               |			Счет = &Счет,
	               |			,
	               |			Субконто3 = &Склад
	               |				И Организация = &Организация) КАК ХозрасчетныйОстатки
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	ХозрасчетныйОстатки.Счет,
	               |	ХозрасчетныйОстатки.Субконто1,
	               |	ХозрасчетныйОстатки.Субконто3,
	               |	ХозрасчетныйОстатки.Организация
	               |
	               |ИМЕЮЩИЕ
	               |	СУММА(ХозрасчетныйОстатки.КоличествоОстатокДт) > 0";
	
	Запрос.Текст = ТекстЗапроса;
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	Строки = Новый Массив();
	
	Пока Выборка.Следующий() Цикл
		НоваяСтрока = Новый Структура("Номенклатура,ЕдиницаИзмерения,Коэффициент,Количество,Счет,ОтражениеВУСН");
		НоваяСтрока.Номенклатура = Выборка.Субконто1;
		НоваяСтрока.ЕдиницаИзмерения = Выборка.Субконто1.ЕдиницаИзмерения;
		НоваяСтрока.Коэффициент 	= 1;
		НоваяСтрока.Количество 		= Выборка.КоличествоОстатокДт;
		НоваяСтрока.Счет 			= Выборка.Счет;
		НоваяСтрока.ОтражениеВУСН 	= Перечисления.ОтражениеВУСН.Принимаются;
		
		Строки.Добавить(НоваяСтрока);
	КонецЦикла; 
	
	Возврат Строки;
		
КонецФункции

Главная процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив), остальной код вызывается отсюда.

Готово, теперь сохраняем обработку идем в режиме 1с:предприятие в меню Администрирование — Печатные формы, отчеты и обработки — Дополнительные обработки — Добавляем в список нашу обработку

Проверяем работу, в документе «тебования-накладная» появится новое меню «Заполнить документ»:

You have no rights to post comments

Заполнение ТЧ стандартного документа из внешней обработки

Я
   kks

13.07.21 — 07:41

Добрый день.

Необходимо из внешней обработки заполнить документ ПоступлениеТоваровУслуг.

Реквизиты заполняются нормально, а вот ТЧ Товары нет

Есть ли стандартный способ, без изменения ОбработкаЗаполнения в расширении заполнения ТЧ документа, либо ТЧ формы документа.

Код вызова формы следующий:

        ДанныеЗаполнения = Новый Структура;

    ДанныеЗаполнения.Вставить(«Контрагент»,Объект.Контрагент);

    ДанныеЗаполнения.Вставить(«ДоговорКонтрагента»,Объект.ДоговорКонтрагента);

    ДанныеЗаполнения.Вставить(«Товары»,Объект.СписокНоменклатурыДокументов);

    
    ПараметрыДляОповещения = Новый Структура;

    ПараметрыДляОповещения.Вставить(«ЧтоСделаноНаФорме», «»);

    ЗакрытиеОбратныйВызов = Новый ОписаниеОповещения(«ОбработкаЗакрытияФормы», ЭтаФорма,ПараметрыДляОповещения);

    
    ОткрытьФорму(«Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары»,Новый Структура(«ЗначенияЗаполнения»,ДанныеЗаполнения), ЭтаФорма,,,,ЗакрытиеОбратныйВызов);

  

Партнерская программа EFSOL Oblako

   SSSSS_AAAAA

1 — 13.07.21 — 08:46

(0)

1. Для заполнения любых частей документа форма совершенно не нужна.

2. Документы хорошо заполняются прямым обращениям к частям документа без ОбработкаЗаполнения и структур.

   Peka50

2 — 13.07.21 — 10:09

А если нужно вызвать экспортный обработчик формы ?

   kks

3 — 13.07.21 — 10:10

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

   Peka50

4 — 13.07.21 — 10:14

вот пример кода. Но у меня не получается автоматически сохранить форму с данными. Сохраняется только пустая табличная часть

&НаКлиенте

Процедура СоздатьДокументаАванса(Команда)

    
    Форма = ПолучитьФорму(«Документ.НачислениеЗаПервуюПоловинуМесяца.Форма.ФормаДокумента», );

    
    ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную

    ЗаполнитьДокументНаСервереБезКонтекста(ДанныеФормы); // Заполняем шапку документа на сервере

    КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);

    Форма.Открыть();

    
    РасчетЗарплатыРасширенныйКлиент.ЗаполнитьДокументНачисленияЗарплаты(Форма);  // заполняем табличную часть документа    

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

&НаСервереБезКонтекста

Функция ЗаполнитьДокументНаСервереБезКонтекста(ДанныеФормы);

    Док = ДанныеФормыВЗначение(ДанныеФормы, Тип(«ДокументОбъект.НачислениеЗаПервуюПоловинуМесяца»));

    Док = Документы.НачислениеЗаПервуюПоловинуМесяца.СоздатьДокумент();

    
    Док.Дата = ТекущаяДата();

    Док.МесяцНачисления = ‘20210701’;

    Док.ОкончаниеПериодаНачисления = ‘20210715’;

    ЗначениеВДанныеФормы(Док, ДанныеФормы);

КонецФункции

   arsik

5 — 13.07.21 — 10:14

(0) В БСП есть механизм внешних обработок. Через него делайте. Там есть, как раз для таких случаев, ввод на основании.

   Peka50

6 — 13.07.21 — 10:25

Ввод на основании не даст возможности использовать процедуру формы.

   kks

7 — 13.07.21 — 10:31

Да вопроса нет: заполнить Объект и запихнуть его в форму. Но я понимаю, что ПолучитьФорму — это моветон, использовать его неправильно, а без этого метода не получается. Или я неправильно понимаю стандарты разработки?

   Peka50

8 — 13.07.21 — 10:33

Вы правильно понимаете, но на 17 релизе это работает.

   kks

9 — 13.07.21 — 10:35

Ввод на основании для данного документа в стандарте подразумевает только Счёт и ещё 2 документа, в этом списке нет внешней обработки

   kks

10 — 13.07.21 — 10:37

С чем связано отсутствие в ОбработкеЗаполнения заполнения ТЧ документа по произвольной ТЧ не понятно. Кто-то владеет этой информацией?

   SSSSS_AAAAA

11 — 13.07.21 — 10:54

(3) Да пусть проверяет сколько угодно. После заполнения.

   SSSSS_AAAAA

12 — 13.07.21 — 10:57

(10) Обработки заполнения никогда не принимали произвольные данные. Они всегда были рассчитаны или на известные им документы или на входную структуру, хотя бы частично совпадающую со структурой заполняемого документа.

   SSSSS_AAAAA

13 — 13.07.21 — 10:59

(10) Разумеется. Внешние обработки никогда не были основанием для ввода.

   ДенисЧ

14 — 13.07.21 — 10:59

(10) Обработка заполнения изначально задумывалась для интерактива. Как тебе пользователь передаст интерактивно произвольную ТЗ?

   SSSSS_AAAAA

15 — 13.07.21 — 11:01

(7) А при ем тут стандарты обработки? Еще раз — заполнение документа совершенно никак не связано с формой. Заполняете докуметн и потом открываете заполненный документ для правки пользователем. Каким боком тут ПолучитьФорму и стандарты разработки?

   Kassern

16 — 13.07.21 — 11:08

(0) В СведенияОВнешнейОбработке указываешь :

ПараметрыРегистрации.Вставить(«Вид», «ЗаполнениеОбъекта»);

На форме создаешь экспортную процедуру на клиенте ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив)

Далее в ней уже можешь обратиться к открытому документу, например: ТвойДокумент=ВладелецФормы.Объект;

И делай в этой процедуре все что хочешь, хочешь ТЧ перезаполняй, хочешь, реквизиты меняй.

   Kassern

17 — 13.07.21 — 11:09

(16) через дополнительные обратоки у тебя добавится кнопка в определенный тобой документ. По ней будет выполняться экспортная процедура на форме внешней обработки.

   Kassern

18 — 13.07.21 — 11:09

(17) *дополнительные обработки)

   GreyK

19 — 13.07.21 — 11:29

(0) Конфигурация какая?

   kks

20 — 13.07.21 — 11:46

Бухгалтерия предприятия 3.0 последняя

   kks

21 — 13.07.21 — 11:53

(17)  Внешняя обработка получает xml из другой базы не 1с с документами поступлений.

Список выводится на форму.

При щелчке на строке открывается вторая форма, в которой производится сравнение объектов из xml и базы: контрагент, номенклатура, организация, склад. При отсутствии создаются новые элементы справочников вручную

По кнопке вызывается форма документа ПоступлениеТоваровИУслуг.

Если документ проведён, то на форму в обработке поступает номер накладной и выгружается в xml.

Поэтому не понятно, как это будет обработка  ЗаполнениеОбъекта?

   GreyK

22 — 13.07.21 — 11:55

(20) В БП3 можно заполнить по структуре. Создаешь структуру, вставляешь в неё основные реквизиты документа, вставляешь таблицу значений «Товары» и всё! Видишь как  всё просто :)

   GreyK

23 — 13.07.21 — 11:59

+(22) Посмотри ЗаполнениеДокументов.Заполнить(ЭтотОбъект, ДанныеЗаполнения, Истина)

Там есть строчки:

    Если ТипДанныхЗаполнения = Тип(«Структура») Тогда

        ЗаполнитьПоСтруктуре(ДокументОбъект, ДанныеЗаполнения, МетаданныеДокумента);

    КонецЕсли;

   kks

24 — 13.07.21 — 12:53

(23) Не всё так просто. Если бы глубже залезли в процедуру ЗаполнитьПоСтруктуре, то там заполняют одни реквизиты, без ТЧ. ТЧ заполняется только в Модуле Менеджера в функции ЗаполнитьНаОснованииСчета или что-то около того

   hhhh

25 — 13.07.21 — 13:10

(24) а это тогда что у вас?

ДанныеЗаполнения.Вставить(«Товары»,Объект.СписокНоменклатурыДокументов);

    

Товары это и есть таб часть. Но вы туда какую-то херню похоже лепите, вместо таблицы.

   1Сергей

26 — 13.07.21 — 13:40

Вы со скольки метров ТЧ от ТЗ отличаете?

   kks

27 — 13.07.21 — 13:53

(25) Это я пробовал передать ТЧ. Но обработки ТЧ при ОбработкаЗаполнения в стандарте НЕТ (Точнее есть, если заполнен ДанныеЗаполнения.Основание).

Видимо самый простой способ: в расширение добавить «После» ОбработкаЗаполнения. И там проверить наличие своего индикатора, например ДанныеЗаполнения.ОснованиеВнешнее = True и пробовать заполнить ТЧ документа

Если у кого-то есть конкретные механизмы, с которыми реально сталкивались, то я буду рад, чтобы всё было по одинэсовскому феншую

   GreyK

28 — 13.07.21 — 13:56

(27) У меня в РТ сделано так:

        Форма = ПолучитьФорму(«Документ.ПоступлениеТоваров.ФормаОбъекта»);

        ДанныеФормы = Форма.Объект;

        СформироватьДокументНаСервере(ДанныеФормы);

        КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);

        Форма.Открыть();

   1Сергей

29 — 13.07.21 — 14:01

У меня вот так сделано

&НаКлиенте

Процедура ПеренестиТовары(Команда)

    ОчиститьСообщения();

    ПеренестиТоварыФрагмент();

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

&НаКлиенте

Процедура ПеренестиТоварыФрагмент()

    
    Перем СтруктураВыбора;

    
    Если ПроверитьЗаполнение() Тогда

        Закрыть();

        СтруктураВыбора = Новый Структура();

        СтруктураВыбора.Вставить(«АдресТоваровВХранилище», ПоместитьМатериалыВХранилище());

        Если ЗначениеЗаполнено(ИмяТЧ) Тогда

            СтруктураВыбора.Вставить(«ИмяТЧ», ИмяТЧ);

        КонецЕсли;

        ОповеститьОВыборе(СтруктураВыбора);

    КонецЕсли;

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

&НаСервере

Функция ПоместитьМатериалыВХранилище()

    
    Материалы = Объект.МатериалыИУслуги.Выгрузить();

    Возврат ПоместитьВоВременноеХранилище(Материалы);

    
КонецФункции

   kks

30 — 13.07.21 — 14:05

   kks

31 — 13.07.21 — 14:33

Решил, основываясь на статье и ваших подсказках:

1. В модуле формы внешней обработки:

[1C]

&&НаСервере

Функция СоздатьНовыйДокументНаСервереИПолучитьЕгоДанные()

    ДокТМП = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();

    ДокТМП.Контрагент = Объект.Контрагент;

    ДокТМП.ДоговорКонтрагента = Объект.ДоговорКонтрагента;

    
    Для Каждого СтрокаТЧ ИЗ Объект.СписокНоменклатурыДокументов Цикл

        НоваяСтрока = ДокТМП.Товары.Добавить();

        НоваяСтрока.Номенклатура = СтрокаТЧ.Номенклатура;

    КонецЦикла;

    
    Возврат ПолучитьДанныеОбъектаДляФормыНового(ДокТМП);

КонецФункции

&НаСервере

Функция ПолучитьДанныеОбъектаДляФормыНового(ОбъектДанных)

    СтруктураДанныхОбъекта = Новый Структура();

    Для каждого Реквизит ИЗ Метаданные.Документы.ПоступлениеТоваровУслуг.Реквизиты Цикл

        СтруктураДанныхОбъекта.Вставить(Реквизит.Имя, ОбъектДанных[Реквизит.Имя]);

    КонецЦикла;

    
    ТблТМП = Новый ТаблицаЗначений;

    ТблТМП.Колонки.Добавить(«Имя»);

    ТблТМП.Колонки.Добавить(«Адрес»);

    Для каждого ТабЧасть ИЗ Метаданные.Документы.ПоступлениеТоваровУслуг.ТабличныеЧасти Цикл

        Если ОбъектДанных[ТабЧасть.Имя].Количество() = 0 Тогда

            Продолжить;

        КонецЕсли;

        
        СтрТМП = ТблТМП.Добавить();

        СтрТМП.Имя     = ТабЧасть.Имя;

        СтрТМП.Адрес = ПоместитьВоВременноеХранилище(ОбъектДанных[ТабЧасть.Имя].Выгрузить(),Новый УникальныйИдентификатор());

    КонецЦикла;

    
    Если НЕ ТблТМП.Количество() = 0 Тогда

        СтруктураДанныхОбъекта.Вставить(«АдресОписаниеТабЧастей», ПоместитьВоВременноеХранилище(ТблТМП,Новый УникальныйИдентификатор()));

    КонецЕсли;

    
    Возврат СтруктураДанныхОбъекта;

КонецФункции

&НаКлиенте

Процедура СоздатьДокумент(Команда)

    ДанныеЗаполнения = СоздатьНовыйДокументНаСервереИПолучитьЕгоДанные();

    
    ПараметрыДляОповещения = Новый Структура;

    ПараметрыДляОповещения.Вставить(«ЧтоСделаноНаФорме», «»);

    ЗакрытиеОбратныйВызов = Новый ОписаниеОповещения(«ОбработкаЗакрытияФормы», ЭтаФорма,ПараметрыДляОповещения);

    
    ОткрытьФорму(«Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары»,Новый Структура(«ЗначенияЗаполнения»,ДанныеЗаполнения), ЭтаФорма,,,,ЗакрытиеОбратныйВызов);

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

[1C]

2. В расширении конфигурации. МодульОбъекта ПоступлениеТоваровУслуг:

[1C]

&После(«ОбработкаЗаполнения»)

Процедура РасшУПП_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

    ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);

    Если ДанныеЗаполнения <> Неопределено Тогда        

        Если ТипДанныхЗаполнения = Тип(«Структура») И ДанныеЗаполнения.Свойство(«АдресОписаниеТабЧастей») Тогда

            ОписаниеТабЧастей = ПолучитьИзВременногоХранилища(ДанныеЗаполнения.АдресОписаниеТабЧастей);

            Для каждого ОписаниеТабЧасти Из ОписаниеТабЧастей Цикл

                  ТблТМП = ПолучитьИзВременногоХранилища(ОписаниеТабЧасти.Адрес);

                  ЭтотОбъект[ОписаниеТабЧасти.Имя].Загрузить(ТблТМП);

            КонецЦикла;            

        КонецЕсли;        

    КонецЕсли;

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

[1C]

Не нашел каким тегом код свернуть

Содержание:

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

2.       Описание модуля формы

3.       Перенос изменений в документ

На практике часто возникает потребность реализовать инструмент, с помощью которого можно было бы корректировать табличную часть документа из вспомогательной формы, пользуясь функционалом дополнительных внешних обработок. Например, для программы 1С Управление торговлей редакция 11 разработать аналог обработки табличной части, используемой в конфигурации Управление торговлей 10.3 (см. рис.). При этом конфигурация должна находиться на поддержке без возможности изменения.

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

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

 

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

Создаем внешнюю обработку. В модуле внешней обработки создаем экспортную процедуру «СведенияОВнешнейОбработке». В параметр «Вид» устанавливаем значение «ЗаполнениеОбъекта», настройку команды «Использование» устанавливаем «ОткрытиеФормы».

Создаем форму обработки с необходимыми элементами управления. В нашем случае это – поле для ввода процента и таблица, в которой будут отражены строки табличной части документа. Создаем две команды «Рассчитать» и «Перенести в документ». По кнопке «Рассчитать» мы будем вычислять в таблице формы обработки новое значение цены с учетом процента, а по кнопке «Перенести в документ» — заполнять табличную часть документа новыми значениями.

 

  

2. Описание модуля формы

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

Ссылку на документ можно получить из параметра формы «ОбъектыНазначения». Этот параметр доступен внешним обработкам в режиме «ОткрытиеФормы». Параметр «ОбъектыНазначения» представляет собой массив ссылок выбранных документов. В нашем случае мы будем запускать обработку только из формы документа, следовательно, массив объектов назначения будет содержать только один элемент с индексом 0.

 

Мы описали заполнение формы исходными данными и переходим к описанию функционала изменения значений табличной части. На данном этапе мы реализуем задачу нашей обработки. Здесь можно изменить количество, цену, ставку налога и т.д. Не забываем, что состав колонок реквизита формы Товары тоже должен соответствовать поставленной задаче. Я выбрал самый простой вариант — изменение цены.

 

3.   Перенос изменений в документ

Переходим к завершающему этапу – перенос изменений в документ. Вот на этом этапе и возникает вопрос: «Как это сделать?». Традиционно перенос данных в документ осуществляется механизмом оповещений, но в нашем случае конфигурация полностью на поддержке с запретом изменений, и нет возможности обработать нетиповую ситуацию. Для решения этой задачи используем свойство управляемой формы «ВладелецФормы». Владельцем формы является форма нашего документа и устанавливается системой автоматически в режиме «ОткрытиеФормы». Через свойство владелец формы может получить доступ к ее основному реквизиту «Объект», в состав которого входит коллекция строк табличной части «Товары». Важно помнить, что свойство «ВладелецФормы» всегда доступно на клиенте открытой формы.

Учитывая данную возможность, обработаем в цикле строки документа и установим новые значения. Для поиска соответствующей строки используем реквизит «НомерСтроки».

Если мы меняем какое-либо числовое значение, то чаще всего необходимо выполнить пересчет связанных значений в строке. Например, изменяя цену необходимо пересчитать сумму, сумму НДС и что-то еще. Для этого лучше использовать типовые процедуры пересчета табличной части. Перенесем из документа в нашу форму типовой обработчик события изменения цены – «ТоварыЦенаПриИзменении».

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

Специалист компании ООО «Кодерлайн» 

Игорь Торба.

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии