gifts2017

Сохраняемые дополнительные реквизиты без изменения закрытости конфигурации (доработан другой вариант)

Опубликовал Юрий Батяев (ybatiaev) в раздел Программирование - Практика программирования

В поставленном ТЗ указано, что: 1. Документ должен содержать дополнительные сохраняемые поля; 2. Конфигурация должна остаться "оригинальной", т.е. закрытой, для упрощения установки обновления версий

Желание заказчика, если не расходится с Законом, и существенно облегчает работу всегда должно быть выполнено и качественно. Поставлено вот такое ТЗ:
1. документ должен содержать дополнительные поля для контроля;
2. Конфигурация должна остаться "оригинальной", т.е. закрытой.

Документ – АвансовыйОтчет. Движения, формируемые документом, должны быть такие, как и раньше, но вот форма ввода документа и форма печати меняется в части внесения дополнительных реквизитов в табличную часть.

Подробнее.

Сотрудник берёт сумму в рублях на командировку за рубеж. Расходует её по своему усмотрению. К примеру, покупка билетов (туда и обратно), проживание в гостинице за валюту и т.п.. Короче присутствуют РАЗНЫЕ валюты в разных строках ТЧ документа, отличные от рублей. Поскольку организация работает только с рублями, то никаких валютных касс нет... и не надо. Но вот понять, куда что ушло – необходимо.

 Первое решение было следующее:

  1. Используем расширение конфигураций. В форме документа, добавленной в расширение, вписываем новые реквизиты формы (Валюта, СуммаВВалюте, Курс), добавляем новые функции. Добавляем дополнительный отчёт;
  2. Проблема осталась с сохранением данных, точнее нет проблем, сохраняем с помощью механизма ХранилищеДанных, где однозначно идентифицируем хранилище по идентификатору документа

Перед сохранением данных добавляем процедуру

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

При открытии формы добавляем процедуру

&НаСервере
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  УстановитьВыполнениеПослеОбработчиковСобытия("ВыполнитьПослеТиповогоОбработчика", );
КонецПроцедуры

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

Тут сохранение производится только для одного пользователя, чтение тоже от этого пользователя "ИмяЕдиногоПользователя". В следствии этого включается и отключается привилигированный режим.

В принципе задача решена и всё работает, но...

Хочется узнать насколько корреткное такого рода решение в части использования хранилища данных? По идее внутренняя таблица, используемая для хранилища данных форм не ограничена в объёме данных для клиент-серверного решения.

Второй вариант. Добавлено и доработано.

Опыт использования и ответы показали, что первый вариант не работает или работает непродолжительное время. Поэтому пришёл к варианту использования дополнительных сведений(тоже стандартный механизм).

В администрирований установил возможность использования дополнительных реквизитов и сведений.  Ввёл дополнительнительное сведение "ДопСведенияИТД" для документа "Авансовый отчет" с неограниченной длинной строки.  По сути все доп данные для каждой таблицы для каждой строки, которых нет в типовой конфигурации записываются именно в этот параметр как строка с разделителями. Разделитель стандартный ";", но уже имелся опыт, когда пользователи вводили и такой символ в наименовании.

Также, мне показался интересен вариант сохранения не простого текста, а формата JSON, т.к. этот формат наиболее информативен и любые символы там вроде как разрешены (с экранированием)

Жду замечаний и предложений.

Скачать файлы

Наименование Файл Версия Размер
АвансовыйОтчет_161206_006.cfe
.cfe 75,49Kb
08.12.16
0
.cfe 161206_006 75,49Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Геннадий Жаркой (ifal) 03.11.16 18:38
А почему выбрали именно хранилище настроек? Если уж конфигурацию менять нельзя, то почему бы не использовать дополнительные реквизиты (да хоть прикрепляемые файлы)? по крайней мере это не будет зависеть от платформы, а если косячная платформа выйдет и похерит настройки форм?
FractonKireyev; ybatiaev; +2 Ответить 1
2. Юрий Батяев (ybatiaev) 03.11.16 23:47
(1) ifal, Тоже так думаю. В прикрепленных файлах было бы удобнее с одной стороны, но это дополнительная операция чтение-запись дополнительная. Пока отказался. А что может "почистить" данные хранилища в принципе? Новые формы?
3. Геннадий Жаркой (ifal) 04.11.16 20:31
(2) ybatiaev, у вас в любом случае чтение и запись, хранилище настроек тоже в базе хранятся.
Хранилище настроек по большей части это такие данные, при потере которых целостность базы данных не пострадает, соответственно и требование целостности к этим данным другие. Например, при работе с СУБД Postgres был перепад напряжения и база оказалось поврежденной, после небольшого анализ причина была найдена в таблице пользовательских настроек определенной формы списка документа, решение было простое: очистить записи этой таблицы по определенному документу. Если тоже самое произойдет с настройками формы, где сделано хранение данных как у вас, уже так просто не решишь проблему. Другими словами, всему свое место.

И еще момент, вы сохраняете данные для пользователя, которого нет в базе, на сколько я понимаю. Вот если сделать тестирование и исправление полное, интересно, удалить ли система эти данные, как записи, для которых нет ключевого объекта-пользователя.
4. Юрий Батяев (ybatiaev) 05.11.16 17:56
(3) ifal, Пользователь точно есть. И он с правом администрирования базы данных. Без реального пользователя сохранить нельзя. По поводу второго варианта тоже есть решение уже. Вообще, на мой взгляд, оба решения "по нормальному" не верные и идут от ущербности расширения. Надо потестить 8.3.9.1850 ещё. Спасибо за ответ!
5. Геннадий Жаркой (ifal) 05.11.16 21:37
(4) ybatiaev, вот на счет "нормальности" таких решений абсолютно согласен!
6. Дмитрий (Омский Домовой) 09.11.16 09:47
Иногда приходится чистить настройки пользователей в том числе и форм. В таком случае сохраненные там данные будут потеряны.
7. Александр (МимохожийОднако) 09.11.16 11:18
Можно попробовать использовать РС "Безопасное хранилище данных"
8. Юрий Батяев (ybatiaev) 09.11.16 13:23
(6) Омский Домовой, Да, именно из-за этого и написал тут, хотелки клиента сделал, но и проблемы с формами известны. Тем более формы вообще имеют свойства меняться. Через год поменяются с управляемых на суперуправляемые и вcё. Поэтому этот вариант не хороший. Согласен с Вам. В 8.3.9.* вроде бы что-то обещают сделать
9. Никита Бунин (nikivr) 16.11.16 23:09
(7) МимохожийОднако,
Подскажите пожалуйста как это правильно сделать или возможно есть готовые примеры разработки?
Спасибо
10. Юрий Батяев (ybatiaev) 17.11.16 09:21
(9) nikivr, так мы сейчас сделали в прикрепляемых файлах, поскольку файлы уже никто не удалит с сервера. Но прикрепляемые файлы и статистика не очень дружат. Сами понимаете, чтобы собрать статистику по 1000 записей нужно столько же раз произвести чтение. Но сейчас ставим 8.3.9.* и там ещё посмотрим варианты. Безопасное хранилище тоже небольшой выход. Напишу, как будет вариант.
11. Никита Бунин (nikivr) 17.11.16 19:49
(10) ybatiaev,
Я ставил 8.3.9 чтобы полноценно начать пользоваться расширениями конфы. Создавать дополнительные реквизиты в расширении мы не можем.
А чем вам не нравится РС Безопасное хранилище данных? Будет дольше читать из хранилища, нежели из прикрепленных файлов?
12. Юрий Батяев (ybatiaev) 17.11.16 19:51
(11) nikivr, Немного загрузка. Но и это попробую.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа