Подробное техническое описание реализованной логики работы с элементом формы "ВидРасчетаСписок", разработанной в рамках задачи CRM4DEV-966. Описание подготовлено для передачи другому программисту и позволяет понять, как работает механизм отображения и сохранения выбранных значений из выпадающего списка (множественный выбор), а также как обеспечивается контроль изменений.


screenshot-3.png

📄 Описание логики обработки множественного выбора: ВидРасчетаСписок

1. Общее назначение

Механизм предназначен для отображения и управления списком выбранных "видов расчёта" в документе "Реализация недвижимости". Он реализует:

✅ Это позволяет гибко управлять финансовыми параметрами договора на основе выбранных типов расчётов.


2. Используемые объекты конфигурации

ОбъектНазначение
РегистрСведений.Дев_ВидыРасчетовДоговоровХранит связь: ДоговорВидРасчета.
Перечисление.Дев_ВидыРасчетовСодержит список возможных видов расчётов (например, "Аванс", "Оплата по этапам", "Единовременно").
Реквизит формы ВидРасчетаСписокЭлемент управления на форме для отображения и редактирования выбранных значений.
Реквизит формы ВидРасчетаСписокБуферБуферная копия ВидРасчетаСписок для сравнения изменений.

⚠️ Реквизиты ВидРасчетаСписок и ВидРасчетаСписокБуфер должны быть объявлены на форме как свойства типа СписокЗначений.


3. Логика работы — пошагово

🔁 Этап 1: При открытии документа (ПриСозданииНаСервере)

Вызывается процедура:

ЗаполнитьВидРасчетаСписок();

Алгоритм:

  1. Проверяется, что документ уже создан (Объект.Ссылка <> Неопределено).
  2. Формируется запрос к регистру Дев_ВидыРасчетовДоговоров:
    ПараметрыОтбора.Договор = Объект.Ссылка;
    
  3. Выполняется чтение всех записей для текущего договора.
  4. Для каждой найденной записи:

✅ Таким образом, при открытии документа отображаются все ранее сохранённые виды расчётов.


🔁 Этап 2: При редактировании пользователем

Пользователь может:

Изменения фиксируются только в реквизите ВидРасчетаСписок, а ВидРасчетаСписокБуфер остаётся неизменным до момента сохранения.


🔁 Этап 3: При записи документа (ПриЗаписиНаСервере)

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

Алгоритм:

  1. Происходит сравнение двух списков:
  2. Если списки не идентичны — вызывается сохранение.

🔁 Этап 4: Сохранение изменений (ЗаписатьДанныеВидовРасчетаДоговора())

Процедура выполняет следующие действия:

МенеджерРегистра = РегистрыСведений.Дев_ВидыРасчетовДоговоров;
ТзДляЗаполнения = МенеджерРегистра.ТаблицаЗначенийПараметровДляЗаписиВРегистр();
  1. Формируется новая таблица значений для записи в регистр.

  2. Все текущие значения из ВидРасчетаСписок добавляются в таблицу:

    Для Каждого Эл Из ВидРасчетаСписок Цикл
        НоваяСтрока = ТзДляЗаполнения.Добавить();
        НоваяСтрока.Договор = Объект.Ссылка;
        НоваяСтрока.ВидРасчета = Эл.Значение;
    КонецЦикла;
    
  3. Выполняется полная замена данных в регистре:

    МенеджерРегистра.ЗаписатьЗначения(ПараметрыЗаписи);
    

    ⚠️ Это означает, что все старые записи удаляются, и вместо них создаются новые.

  4. Буфер обновляется:

    ВидРасчетаСписокБуфер.Очистить();
    ВидРасчетаСписокБуфер.ЗагрузитьЗначения(ВидРасчетаСписок.ВыгрузитьЗначения());
    

✅ После этого механизм готов к следующему циклу редактирования.


4. Диаграмма последовательности

Пользователь открывает документ
        ↓
ПриСозданииНаСервере()
        ↓
ЗаполнитьВидРасчетаСписок()
        ↓
Чтение из Регистра: Дев_ВидыРасчетовДоговоров
        ↓
Заполнение: ВидРасчетаСписок + ВидРасчетаСписокБуфер
        ↓
Пользователь редактирует список
        ↓
ПриЗаписиНаСервере()
        ↓
Сравнение: ВидРасчетаСписок ≠ ВидРасчетаСписокБуфер?
        ↓ Да
ЗаписатьДанныеВидовРасчетаДоговора()
        ↓
Удаление старых записей + создание новых в регистре
        ↓
Обновление буфера
        ↓
Документ сохранён

5. Что уже реализовано

ФункцияРеализованоКомментарий
Загрузка значений при открытииЧерез ЗаполнитьВидРасчетаСписок()
Отображение в интерфейсеЧерез элемент СписокЗначений
Контроль измененийСравнение через СпискиЗначенийИдентичны()
Сохранение в регистрПолная перезапись данных
Поддержка множественного выбораРаботает с массивом значений
Обновление буфера после сохраненияГарантирует актуальность состояния

6. Преимущества подхода


7. Возможные улучшения

НаправлениеРекомендация
Частичное обновление регистраСейчас удаляются все записи. Можно реализовать дифф: удалить только исключённые, добавить новые.
Журнал измененийДобавить запись в журнал регистрации при изменении состава.
Подтверждение при удаленииЕсли удаляется важный вид расчёта — спросить подтверждение.
Валидация набораПроверять, что выбран хотя бы один обязательный вид расчёта.
Расшифровка в отчётахСоздать СКД-отчёт по видам расчётов по договорам.

8. Пример использования

Сценарий:
Пользователь открыл договор №100 на реализацию квартиры.
В регистре есть записи:

При открытии они отобразились в поле "Виды расчётов".
Пользователь убрал "Оплата по этапам", добавил "Единовременно".

При сохранении:

  1. Система сравнила списки — нашла отличие.
  2. Удалила старые записи из Дев_ВидыРасчетовДоговоров.
  3. Записала новые:
  4. Обновила буфер.

9. Заключение

Реализованный механизм — надёжное и гибкое решение для управления множественными ссылками в документе. Он соответствует лучшим практикам 1С:

Документ подготовлен так, чтобы новый программист мог: