CRM4DEV-966 - Получение подробных данных проблемы... СТАТУС
Подробное техническое описание реализованной логики работы с элементом формы "ВидРасчетаСписок", разработанной в рамках задачи CRM4DEV-966. Описание подготовлено для передачи другому программисту и позволяет понять, как работает механизм отображения и сохранения выбранных значений из выпадающего списка (множественный выбор), а также как обеспечивается контроль изменений.
📄 Описание логики обработки множественного выбора: ВидРасчетаСписок
1. Общее назначение
Механизм предназначен для отображения и управления списком выбранных "видов расчёта" в документе "Реализация недвижимости". Он реализует:
- Загрузку ранее выбранных значений при открытии документа.
- Отображение этих значений в элементе формы
ВидРасчетаСписок(тип — список со множественным выбором). - Контроль изменений пользователем.
- Автоматическое сохранение изменений в регистр сведений при записи документа.
✅ Это позволяет гибко управлять финансовыми параметрами договора на основе выбранных типов расчётов.
2. Используемые объекты конфигурации
| Объект | Назначение |
|---|---|
| РегистрСведений.Дев_ВидыРасчетовДоговоров | Хранит связь: Договор → ВидРасчета. |
| Перечисление.Дев_ВидыРасчетов | Содержит список возможных видов расчётов (например, "Аванс", "Оплата по этапам", "Единовременно"). |
Реквизит формы ВидРасчетаСписок | Элемент управления на форме для отображения и редактирования выбранных значений. |
Реквизит формы ВидРасчетаСписокБуфер | Буферная копия ВидРасчетаСписок для сравнения изменений. |
⚠️ Реквизиты
ВидРасчетаСписокиВидРасчетаСписокБуфердолжны быть объявлены на форме как свойства типаСписокЗначений.
3. Логика работы — пошагово
🔁 Этап 1: При открытии документа (ПриСозданииНаСервере)
Вызывается процедура:
ЗаполнитьВидРасчетаСписок();
Алгоритм:
- Проверяется, что документ уже создан (
Объект.Ссылка <> Неопределено). - Формируется запрос к регистру
Дев_ВидыРасчетовДоговоров:ПараметрыОтбора.Договор = Объект.Ссылка; - Выполняется чтение всех записей для текущего договора.
- Для каждой найденной записи:
- Значение
ВидРасчетадобавляется вВидРасчетаСписок. - То же значение добавляется в буфер
ВидРасчетаСписокБуфер.
- Значение
✅ Таким образом, при открытии документа отображаются все ранее сохранённые виды расчётов.
🔁 Этап 2: При редактировании пользователем
Пользователь может:
- Добавить новые значения.
- Удалить существующие.
Изменения фиксируются только в реквизите ВидРасчетаСписок, а ВидРасчетаСписокБуфер остаётся неизменным до момента сохранения.
🔁 Этап 3: При записи документа (ПриЗаписиНаСервере)
Если Не ОбщегоНазначенияКлиентСервер.СпискиЗначенийИдентичны(ВидРасчетаСписок, ВидРасчетаСписокБуфер) Тогда
ЗаписатьДанныеВидовРасчетаДоговора();
КонецЕсли;
Алгоритм:
- Происходит сравнение двух списков:
- Текущий (
ВидРасчетаСписок) — после редактирования. - Буферный (
ВидРасчетаСписокБуфер) — состояние на момент открытия.
- Текущий (
- Если списки не идентичны — вызывается сохранение.
🔁 Этап 4: Сохранение изменений (ЗаписатьДанныеВидовРасчетаДоговора())
Процедура выполняет следующие действия:
МенеджерРегистра = РегистрыСведений.Дев_ВидыРасчетовДоговоров;
ТзДляЗаполнения = МенеджерРегистра.ТаблицаЗначенийПараметровДляЗаписиВРегистр();
Формируется новая таблица значений для записи в регистр.
Все текущие значения из
ВидРасчетаСписокдобавляются в таблицу:Для Каждого Эл Из ВидРасчетаСписок Цикл НоваяСтрока = ТзДляЗаполнения.Добавить(); НоваяСтрока.Договор = Объект.Ссылка; НоваяСтрока.ВидРасчета = Эл.Значение; КонецЦикла;Выполняется полная замена данных в регистре:
МенеджерРегистра.ЗаписатьЗначения(ПараметрыЗаписи);⚠️ Это означает, что все старые записи удаляются, и вместо них создаются новые.
Буфер обновляется:
ВидРасчетаСписокБуфер.Очистить(); ВидРасчетаСписокБуфер.ЗагрузитьЗначения(ВидРасчетаСписок.ВыгрузитьЗначения());
✅ После этого механизм готов к следующему циклу редактирования.
4. Диаграмма последовательности
Пользователь открывает документ
↓
ПриСозданииНаСервере()
↓
ЗаполнитьВидРасчетаСписок()
↓
Чтение из Регистра: Дев_ВидыРасчетовДоговоров
↓
Заполнение: ВидРасчетаСписок + ВидРасчетаСписокБуфер
↓
Пользователь редактирует список
↓
ПриЗаписиНаСервере()
↓
Сравнение: ВидРасчетаСписок ≠ ВидРасчетаСписокБуфер?
↓ Да
ЗаписатьДанныеВидовРасчетаДоговора()
↓
Удаление старых записей + создание новых в регистре
↓
Обновление буфера
↓
Документ сохранён
5. Что уже реализовано
| Функция | Реализовано | Комментарий |
|---|---|---|
| Загрузка значений при открытии | ✅ | Через ЗаполнитьВидРасчетаСписок() |
| Отображение в интерфейсе | ✅ | Через элемент СписокЗначений |
| Контроль изменений | ✅ | Сравнение через СпискиЗначенийИдентичны() |
| Сохранение в регистр | ✅ | Полная перезапись данных |
| Поддержка множественного выбора | ✅ | Работает с массивом значений |
| Обновление буфера после сохранения | ✅ | Гарантирует актуальность состояния |
6. Преимущества подхода
- Простота и надёжность: используется стандартный механизм
СписокЗначений. - Гибкость: легко масштабируется на другие справочники.
- Эффективность: нет лишних запросов при отсутствии изменений.
- Аудируемость: все изменения хранятся в регистре сведений.
7. Возможные улучшения
| Направление | Рекомендация |
|---|---|
| Частичное обновление регистра | Сейчас удаляются все записи. Можно реализовать дифф: удалить только исключённые, добавить новые. |
| Журнал изменений | Добавить запись в журнал регистрации при изменении состава. |
| Подтверждение при удалении | Если удаляется важный вид расчёта — спросить подтверждение. |
| Валидация набора | Проверять, что выбран хотя бы один обязательный вид расчёта. |
| Расшифровка в отчётах | Создать СКД-отчёт по видам расчётов по договорам. |
8. Пример использования
Сценарий:
Пользователь открыл договор №100 на реализацию квартиры.
В регистре есть записи:
- Аванс
- Оплата по этапам
При открытии они отобразились в поле "Виды расчётов".
Пользователь убрал "Оплата по этапам", добавил "Единовременно".
При сохранении:
- Система сравнила списки — нашла отличие.
- Удалила старые записи из
Дев_ВидыРасчетовДоговоров. - Записала новые:
- Аванс
- Единовременно
- Обновила буфер.
9. Заключение
Реализованный механизм — надёжное и гибкое решение для управления множественными ссылками в документе. Он соответствует лучшим практикам 1С:
- Разделение чтения и записи.
- Контроль изменений.
- Использование буфера.
- Чистая интеграция с формой и регистром.
✅ Документ подготовлен так, чтобы новый программист мог:
- Понять логику без чтения кода.
- Безопасно доработать функционал.
- Перенести подход на другие объекты.
