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