Реквизит документа + реквизит движения регистра + поле на типовой форме для ЕРП/УХ
Задачи пользователя - Адаптация типовых решений
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Задача
Есть документ Приобретение услуг и прочих активов и регистр накопления Расчеты с поставщиками по срокам (ЕРПУХ 3.3, режим совместимости 8.3.27). Нужно:
- добавить в документ реквизит «Финансовая позиция» (СправочникСсылка.СтатьиДоходовИРасходов);
- при проведении значение этого реквизита зафиксировать в реквизит движения регистра;
- показать поле на типовой форме документа;
- внести минимально необходимые изменения типовой конфигурации.
Аналогичный механизм применяли в проектах доработки типовых конфигураций для заказчика. Показываю, сколько из этого можно забрать в расширение.
Ловушка № 1: реквизит движения нельзя добавить расширением
Платформа запрещает добавлять реквизиты (а также измерения и ресурсы) к заимствованным регистрам — вплоть до режима совместимости 8.5.1 включительно (проверено на платформе 8.5.1: «Добавление дочерних объектов этого типа к заимствованным в расширениях недопустимо в режиме совместимости … и ниже»).
Решение: реквизит движения добавляется в конфигурацию. Расширение же заимствует регистр только ради модуля набора записей.
Заполнение при проведении: модуль набора записей
&После("ПередЗаписью")
Процедура тест_ПередЗаписью(Отказ, Замещение)
Если ОбменДанными.Загрузка ИЛИ Отказ Тогда
Возврат;
КонецЕсли;
тест_ЗаполнитьФинансовуюПозицию(ЭтотОбъект);
КонецПроцедуры
Ловушка № 2: регистратор — не тот документ
У регистра взаиморасчетов ЕРП регистратор — Документ.РегистраторРасчетов (движения пишутся через ОперативныеВзаиморасчетыСервер.ЗаписатьПорционно при проведении). Исходный документ лежит в реквизите движения ДокументРегистратор — проверять и читать нужно по нему, а не по системному Регистратор:
ТипДокумента = Тип("ДокументСсылка.ПриобретениеУслугПрочихАктивов");
Для Каждого Запись Из НаборЗаписей Цикл
Если ТипЗнч(Запись.ДокументРегистратор) = ТипДокумента Тогда ...
Не зпабываем использовать БСП - значения реквизитов исходных документов читаем одним пакетным вызовом — ОбщегоНазначения.ЗначениеРеквизитаОбъектов(РасчетныеДокументы, "тест_ФинансоваяПозиция") возвращает Соответствие.
Ловушка № 3: изменился только наш реквизит — движения не переписываются
Типовое проведение ЕРП пишет движения взаиморасчетов только при наличии изменений: ВзаиморасчетыПроведение.ПослеЗаписиДвиженийДокумента выходит, если пуста таблица изменений. Наш реквизит в типовое сравнение не входит - набор не записывается - перехват не срабатывает.
Решение: в модуле объекта документа расширения &После("ОбработкаПроведения") сверяем значения и при расхождении перезаписываем наборы сами (запрос находит регистраторов с расходящимся значением; правятся только строки своего документа, чужие записи в том же наборе не трогаются).
Поле на типовой форме
Форму заимствуем в расширение, а элемент добавляем программно в &После("ПриСозданииНаСервере") — разметку формы не правим, при обнованиях типовой формы меньше конфликтов:
&НаСервере
Процедура тест_ДобавитьПолеФинансовойПозиции()
Группа = Элементы.Найти("ГруппаПараметрыЛево");
Если Группа = Неопределено Тогда Возврат; КонецЕсли;
Если Элементы.Найти("тест_ФинансоваяПозиция") <> Неопределено Тогда Возврат; КонецЕсли;
НовоеПоле = Элементы.Добавить("тест_ФинансоваяПозиция", Тип("ПолеФормы"), Группа);
НовоеПоле.ПутьКДанным = "Объект.тест_ФинансоваяПозиция";
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.УстановитьДействие("ПриИзменении", "тест_ФинансоваяПозицияПриИзменении");
КонецПроцедуры
В ПриИзменении явно взводим Модифицированность = Истина — для программно добавленного поля автоматика не гарантируется, и без этого можно потерять изменение при закрытии.
Две детали, которые всплывают в обсуждениях программного создания элементов (см. ссылки в конце):
- Сначала
ПутьКДанным, потомВид— при установке пути к данным платформа пересчитывает вид элемента по типу данных, поэтому явное присваивание вида должно идти последним. Для СправочникСсылка авто-вид и так «поле ввода» (потому оба порядка работают), но правильный порядок делает приём переносимым на другие типы. ИзменитьРеквизитыне понадобился вовсе: поле привязано к реквизиту документа, а не к реквизиту формы — источник данных уже существует. Если бы реквизит был формовый, его пришлось бы создавать черезИзменитьРеквизиты, и по возможности одним пакетным вызовом (добавлять/удалять реквизиты формы по одному — ресурсоёмко).
Почему всё-таки с заимствованием формы, а не через МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере (так иногда советуют для ЕРП, чтобы не тянуть форму в расширение): в ЕРПУХ 3.3.4.7 форма документа вызывает этот модуль только в событиях записи (ПередЗаписьюНаСервере, ПослеЗаписиНаСервере, клиентский ПослеЗаписи), а при создании формы хука нет — проверено по исходному модулю формы. И второе: УстановитьДействие назначает обработчиком только процедуру модуля формы — наш клиентский ПриИзменении живёт именно там, без своей формы его некуда повесить.
Сборка .cfe без конфигуратора: ibcmd 8.5.1
- Заглушка базы строится из XML-дампа конфигурации:
ibcmd infobase create --import=<дамп> --apply. - Расширение:
config import --extension-config save --extension- готовый .cfe. - Почему не ibcmd 8.3.27: разметка родительской формы содержит значение
DontBlock, которое 8.3.27 не разбирает; минимальная заглушка тоже не срабатывает — заимствованная форма ссылается на команды Post/Write/PostAndClose и реквизиты родительской разметки. Поэтому 8.5.1.
Установка
- В конфигурации должен быть реквизит
тест_ФинансоваяПозиция(СправочникСсылка.СтатьиДоходовИРасходов) у регистра РасчетыСПоставщикамиПоСрокам. - Конфигуратор - Расширения - Создать пустое расширение - Загрузить конфигурацию из файла
тест_ФинансоваяПозиция.cfe, применить. - Проверка: заполнить фин. позицию в документе, провести; в движениях регистра у записей документа реквизит заполнен тем же значением; изменить только фин. позицию и перепровести — значение в движениях обновилось.
Проверено на
- УправлениеХолдингомERP 3.3.4.7 (режим совместимости 8.3.27), платформа 8.5.1.
Похожие публикации:
- Программное создание элементов в форме при… (расширения) и шпаргалка по программному созданию элементов — про форму; наша форма — одна из четырёх частей рецепта, плюс нюанс Модифицированности.
- Программная установка событий формы (форум), ПриИзменении для программно созданных элементов — обсуждают установку обработчиков; я собрал это в рабочий прием.
- Расширение не видит реквизиты регистратора (форум) — смежная проблема привязки регистра в расширении.
- ИТС: Как сформировать движения собственных и заимствованных регистров — официальный минимум; наш случай сложнее (чужой регистратор, свой реквизит движения в конфигурации).
- Взаиморасчеты: документы, регистры, отчеты. ERP 2.5 — про архитектуру взаиморасчетов.
Ключевое отличие: я привел сквозной рецепт «реквизит документа - форма - реквизит движения - проведение - сборка».
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.6.2.59
Вступайте в нашу телеграмм-группу Инфостарт