Разбор ошибок заполнения реквизитов формы объекта (мой топ-3)

30.08.22

Разработка - Работа с интерфейсом

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

О чём идёт речь?

В 1с есть возможность добавлять на форму дополнительные реквизиты формы (см. скриншот). Цель самая разная: буферизация данных, расширение выводимой информации и тому подобное. К сожалению многие разработчики не сразу продумывают где и как заполнять эти реквизиты, отчего возникают различные неприятные ошибки: как визуальные, так и логические. Далее будет топ-3 самых часто встречаемых ошибок и способ их преодоления.

Ошибка 1 - Не учитывать, что данные формы могут быть перечитаны

Задача: отобразить остатки товара в табличной части документа.

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

А дальше пользователь что-то поменял на форме, понял, что ошибся и нажимает кнопку "Перечитать" и колонка очищается.

Что делать? Прописать обновление не только в обработчик ПриСозданииНаСервере, но и в ПриЧтенииНаСервере. Теоретическая часть зачем? и почему? уже достаточно раскрыта на просторах интернета, поэтому просто посмотрим, что делать на практике.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // если ключ пустой - объект новый и только для него вызываем обработчик 
    Если Параметры.Ключ.Пустая() Тогда
        ОбновитьОстатки();
    КонецЕсли;

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

    // а тут и так всё отработает только для объектов базы данны
    ОбновитьОстатки();

КонецПроцедуры
 
 Расширенный вариант

 

Ошибка 2 - Не учитывать нюансы передачи между клиентом и сервером при записи объекта

Задача: отобразить остатки товара в табличной части документа.

Быстрокод: помятуя про ошибку 1 написал всё в ПриСозданииНаСервере и ПриЧтенииНаСервере.

Результат: всё будет хорошо, до тех пор, пока пользователь не нажмёт кнопку "Записать". Результатом опять будет пустая колонка.

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

Что делать? Чтобы не допустить данной ошибки достаточно вызвать заполнение остатков ещё и после записи:

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект)
    ОбновитьОстатки();
КонецПроцедуры

Пара примечаний:

Во-первых, не стоит расширять и делать мега обработчик "ПриСозданииПриЧтенииПослеЗаписи", т.к. всё-таки набор вызываемых функций тут в 99% случаев будет разный.

Во-вторых, такое заполнение касается только дополнительных реквизитов объекта. Н-р: перезаполнять отдельные реквизиты формы в общем случае нет необходимости - они сохраняют своё значение, пока открыта форма.

Случай из практики

Интересное следствие из данной ошибки. Недавно была задача - запоминать определённым образом изменённые строки вплоть до записи объекта. Сделал служебный флаг СтрокаИзменена и при редактировании руками устанавливал его в Истина. Так вот благодаря этой особенности сбрасывать флаг после записи не было нужды, т.к. он сбросится автоматом.

Ошибка 3 - Не учитывать что у нового объекта реквизиты могут быть заполнены*

надо сказать, что эта ситуация более редкая, чем предыдущие 2, но и она встречается

Задача: необходимо в реквизит формы получать ИдентификаторСклада для какой-то бизнес-логики.

Быстрокод: Один из вариантов решения выглядит так:

&НаСервере
Процедура ЗаполнитьИдентификаторСклада()

    Если НЕ Параметры.Ключ.Пустая() Тогда
        ИдентификаторСклада = ПолучитьИдентификаторСклада();
    Иначе
        ИдентификаторСклада = "";
    КонецЕсли;

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

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

&НаСервере
Процедура ЗаполнитьИдентификаторСклада()

    Если ЗначениеЗаполнено(Объект.Склад) Тогда
        ИдентификаторСклада = ПолучитьИдентификаторСклада();
    Иначе
        ИдентификаторСклада = "";
    КонецЕсли;

КонецПроцедуры
 
 А как и где вообще заполнять новые объекты?

 А вы знали, что при открытии формы нового объекта вызывается обработчик объекта ОбработкаЗаполнения, в которую можно и даже нужно положить логику заполнения документа по-умолчанию.

см. рекомендации Где описать собственный алгоритм заполнения реквизитов нового документа?

Заключение

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

разработка управляемые формы реквизиты программирование

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55306    17    23    

43

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    63701    44    59    

82

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    19552    27    6    

42

Работа с интерфейсом Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

1500 руб.

06.10.2020    10769    7    7    

11

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

20.08.2024    20843    mrXoxot    44    

128

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    10329    smielka    37    

105

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    17746    1223    elcoan    53    

125
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. tormozit 7245 30.08.22 09:37 Сейчас в теме
не стоит расширять и делать мега обработчик "ПриСозданииПриЧтенииПослеЗаписи", т.к. всё-таки набор вызываемых функций тут в 99% случаев будет разный

Обоснование "набор вызываемых функций тут в 99% случаев будет разный" у меня вызывает большие сомнения. Хотелось бы пример.
Я использую обработчик "ПриСозданииПриЧтенииНаСервере" и подробно описал это в статье Методика обновления формы объекта данных при изменении объекта с примерами. Кстати твоя "Ошибка 1" этим обработчиком эффективно закрывается и также разобрана в моей статье.
Риник; zeltyr; +2 Ответить
2. zeltyr 692 30.08.22 09:58 Сейчас в теме
(1)
тут ключевая добавка "ПриСозданииПриЧтенииПослеЗаписи". Пример простой: у нас есть реквизит табличной части и реквизит формы Идентификатор склада. Идентификатор склада обновлять после записи нужно будет только в том случае, если в процессе записи склад может поменяться. Т.е. обновить остатки вызвать после записи нужно, а вот обновить идентификатор - нет.

А универсальный "ПриСозданииПриЧтении" конечно нужен и полезен, никаких вопросов не имею.

За статью спасибо, отличная статья - жаль не наткнулся при быстром поиске - так бы дал ссылку в источниках.
3. tormozit 7245 30.08.22 12:09 Сейчас в теме
(2) Согласен, что в целях ускорения можно отключать часть чтений/обновлений связанных данных при вызове этого обработчика из ПослеЗаписи. Но в с развитием конкретной формы постепенно эти оптимизации становится накладно поддерживать, т.к.забытое условное НЕобновление далеко не сразу обнаружишь и встает вопрос:
Важнее надежность обновления данных при доработках или скорость обновления после записи?
Поэтому для тяжелых операций обновления такая оптимизация конечно оправдана, а вот для легких - часто нет.
4. acsent 1204 18.02.23 13:10 Сейчас в теме
(2) Обычно делают процедуру ЗаполнитьДополнительныеПоляТЧ() и везде ее вызывают.
А ПриСозданииПриЧтении - так это следствие косяка платформы, в том что ПриЧтении не вызывается для нового объекта, а ведь он может быть заполнен в процедуре ОбработкаЗаполнения.
5. PerlAmutor 155 01.04.23 18:53 Сейчас в теме
Интересная задача возникает, когда необходимо проверить заполненность реквизита программно добавленного на форму. В ОбработкеПроверкиЗаполнения в модуле объекта доступа к нему уже нет. Если при этом документ проводится без открытия формы, то вообще труба. Столкнулись с этим когда возникла необходимость проверять корректность счета отражения в ERP 2.5. Недобрыми словами я вспоминал разработчика, который придумал справочник НастройкиСчетовУчетаПрочихОпераций.
6. zeltyr 692 02.04.23 19:20 Сейчас в теме
(5) Про ERP 2.5 - rак я вас понимаю. Помню в ERP 2.5 ковырял устройство партий и увидел
СтатусПартии = 17
... Ух как я горел.
Оставьте свое сообщение