Желание заказчика, если не расходится с Законом, и существенно облегчает работу всегда должно быть выполнено и качественно. Поставлено вот такое ТЗ:
1. документ должен содержать дополнительные поля для контроля;
2. Конфигурация должна остаться "оригинальной", т.е. закрытой.
Документ – АвансовыйОтчет. Движения, формируемые документом, должны быть такие, как и раньше, но вот форма ввода документа и форма печати меняется в части внесения дополнительных реквизитов в табличную часть.
Подробнее.
Сотрудник берёт сумму в рублях на командировку за рубеж. Расходует её по своему усмотрению. К примеру, покупка билетов (туда и обратно), проживание в гостинице за валюту и т.п.. Короче присутствуют РАЗНЫЕ валюты в разных строках ТЧ документа, отличные от рублей. Поскольку организация работает только с рублями, то никаких валютных касс нет... и не надо. Но вот понять, куда что ушло – необходимо.
Первое решение было следующее:
- Используем расширение конфигураций. В форме документа, добавленной в расширение, вписываем новые реквизиты формы (Валюта, СуммаВВалюте, Курс), добавляем новые функции. Добавляем дополнительный отчёт;
- Проблема осталась с сохранением данных, точнее нет проблем, сохраняем с помощью механизма ХранилищеДанных, где однозначно идентифицируем хранилище по идентификатору документа
Перед сохранением данных добавляем процедуру
&НаСервере
Процедура Расш1_ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если НЕ Объект.Прочее.Количество() = 0 Тогда
ТЗПрочее = Новый ТаблицаЗначений;
ТЗПрочее = Объект.Прочее.Выгрузить( , "Валюта, СуммаВВалюте, Курс");
Иначе
ТЗПрочее = Неопределено;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ТекущийОбъект.УстановитьСсылкуНового(Документы.АвансовыйОтчет.ПолучитьСсылку(Новый УникальныйИдентификатор));
ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить(ТекущийОбъект.ПолучитьСсылкуНового().УникальныйИдентификатор(), "Прочее", ТЗПрочее, , "ИмяЕдиногоПользователя");
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;
КонецПроцедуры
При открытии формы добавляем процедуру
&НаСервере
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьВыполнениеПослеОбработчиковСобытия("ВыполнитьПослеТиповогоОбработчика", );
КонецПроцедуры
&НаСервере
Процедура ВыполнитьПослеТиповогоОбработчика(Отказ, СтандартнаяОбработка, ДополнительныеПараметры)
Если НЕ Объект.Ссылка.Пустая() Тогда
ТЗПрочее = Новый ТаблицаЗначений;
УстановитьПривилегированныйРежим(Истина);
ТЗПрочее = ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить(
Объект.Ссылка.УникальныйИдентификатор(), "Прочее", Неопределено, , "ИмяЕдиногоПользователя");
УстановитьПривилегированныйРежим(Ложь);
Если НЕ ТЗПрочее = Неопределено Тогда
Для СчСтрок = 0 По Объект.Прочее.Количество() - 1 Цикл
ЗаполнитьЗначенияСвойств(Объект.Прочее[СчСтрок], ТЗПрочее[СчСтрок]);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Тут сохранение производится только для одного пользователя, чтение тоже от этого пользователя "ИмяЕдиногоПользователя". В следствии этого включается и отключается привилигированный режим.
В принципе задача решена и всё работает, но...
Хочется узнать насколько корреткное такого рода решение в части использования хранилища данных? По идее внутренняя таблица, используемая для хранилища данных форм не ограничена в объёме данных для клиент-серверного решения.
Второй вариант. Добавлено и доработано.
Опыт использования и ответы показали, что первый вариант не работает или работает непродолжительное время. Поэтому пришёл к варианту использования дополнительных сведений(тоже стандартный механизм).
В администрирований установил возможность использования дополнительных реквизитов и сведений. Ввёл дополнительнительное сведение "ДопСведенияИТД" для документа "Авансовый отчет" с неограниченной длинной строки. По сути все доп данные для каждой таблицы для каждой строки, которых нет в типовой конфигурации записываются именно в этот параметр как строка с разделителями. Разделитель стандартный ";", но уже имелся опыт, когда пользователи вводили и такой символ в наименовании.
Также, мне показался интересен вариант сохранения не простого текста, а формата JSON, т.к. этот формат наиболее информативен и любые символы там вроде как разрешены (с экранированием)
Жду замечаний и предложений.