Каталог решений - Как добавить реквизит, изменить проводки типовой и не поиметь геморроя при обновлении (пример для бух 3.0)

Как добавить реквизит, изменить проводки типовой и не поиметь геморроя при обновлении (пример для бух 3.0)

Как добавить реквизит, изменить проводки типовой и не поиметь геморроя при обновлении (пример для бух 3.0)

В наличии

Пришли ко мне бухи и говорят:
— у нас в 7.7 было окошко в документе с датами оплаты для книги покупок, сделай нам в 3.0 такое-же.
Ну я типа
— так придется снимать с поддержки, потом при любом обновлении Вам придется все тестировать…. короче геморрой и мне и Вам!
Бухи слезно
— ну надо, очень!
Почесал я репу и стал думать, как и на елку залезть и попу не уколоть…

Категория:

Описание

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

Соответственно создаю регистр  «ДатыКнигиПокупок» (измерения Документ и Дата, на один документ может быть несколько дат) и общий модуль «Мув_ДополнительныеСообщенияПроведения».  Далее снимаю с поддержки форму документа «СчетФактураПолученный» и в ней добавляем

&НаСервере

Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

                // vde69 — сохранение реквизита «Мув_ДатаОплаты»

                Мув_ДополнительныеСообщенияПроведения.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);

                // vde69 — Конец сохранения реквизита «Мув_ДатаОплаты»

КонецПроцедуры

 

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

                // vde69 — Добавление реквизита «Мув_ДатаОплаты»

                Мув_ДополнительныеСообщенияПроведения.ФормаПриСозданииНаСервере(ЭтаФорма, «Продавец», «ГруппаШапкаПравая»);

                // vde69 — Конец добавления реквизита «Мув_ДатаОплаты»

 

 

Собственно это все что мне придется контролировать при обновлении. Далее делаем 2 подписки на событие

«ПриЗаписиДокументовКнигиПокупок» и «ПриПроведенииДокументовКнигиПокупок», идем в новый модуль и там пишем

 

Процедура ПроведениеДокументовОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт

                Если Источник.ОбменДанными.Загрузка Тогда

                               Возврат;

                ИначеЕсли Отказ Тогда

                               Возврат;

                КонецЕсли;

                УстановитьПривилегированныйРежим(Истина);

                Если Метаданные.Документы.Содержит(Источник.Ссылка.Метаданные()) Тогда

                             ДополнительныеДвижения(Источник);

                КонецЕсли;

                УстановитьПривилегированныйРежим(Ложь);

КонецПроцедуры

 

Процедура ПриЗаписиДокументовКнигиПокупокПриЗаписи(Источник, Отказ) Экспорт

                Перем МассивДатОплатКнигиПокупок;

               

                Если Источник.ДополнительныеСвойства.Свойство(«МассивДатОплатКнигиПокупок», МассивДатОплатКнигиПокупок) = Истина Тогда

                               // сохранение дат в регистр

                               мРег = РегистрыСведений.ДатыКнигиПокупок.СоздатьНаборЗаписей();

                               мРег.Отбор.Документ.Установить(Источник.Ссылка, Истина);

                               мРег.Прочитать();

                               мТЗ = мРег.ВыгрузитьКолонки();

                               Для Каждого эл из МассивДатОплатКнигиПокупок Цикл

                                               НоваяСтрока = мТЗ.Добавить();

                                               НоваяСтрока.Документ = Источник.Ссылка;

                                               НоваяСтрока.Дата = Эл;

                               КонецЦикла;

                               мРег.Загрузить(мТЗ);

                               мРег.Записать(Истина);

                Иначе

                               // это запись не из формы — нужно прочитать из регистра и положить в доп свойства

                               Запрос = Новый Запрос(

                               «ВЫБРАТЬ

                               |             ДатыКнигиПокупок.Дата

                               |ИЗ

                               |             РегистрСведений.ДатыКнигиПокупок КАК ДатыКнигиПокупок

                               |ГДЕ

                               |             ДатыКнигиПокупок.Документ = &Документ»);

                              

                               Запрос.УстановитьПараметр(«Документ», Источник.Ссылка);

                               МассивДатОплатКнигиПокупок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(«Дата»);

                               Источник.ДополнительныеСвойства.Вставить(«МассивДатОплатКнигиПокупок», МассивДатОплатКнигиПокупок);

                КонецЕсли;

КонецПроцедуры

 

Процедура ФормаПриСозданииНаСервере (КонтекстФормы, ИмяСледующегоРеквизита, ИмяГруппыВставки) Экспорт

                // добавляем текстовый реквизит «Мув_ДатаОплаты» в группу «ИмяГруппыВставки» перед элементом «ИмяСледующегоРеквизита»

                // заполняет этот реквизит из регистра

               

                Объект = КонтекстФормы.РеквизитФормыВЗначение(«Объект»);

                ДобавляемыеРеквизиты = Новый Массив;

                мРеквизиты = КонтекстФормы.ПолучитьРеквизиты();

                РеквизитЕсть = Ложь;

                Для Каждого тРек из мРеквизиты Цикл

                               Если «Мув_ДатаОплаты» = тРек.Имя Тогда

                                               РеквизитЕсть = Истина;

                               КонецЕсли;

                КонецЦикла;

                Если не РеквизитЕсть Тогда

                               КС = Новый КвалификаторыСтроки(100);

                               Массив = Новый Массив;

                               Массив.Добавить(Тип(«Строка»));

                               ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);

                               ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(«Мув_ДатаОплаты», ОписаниеТиповС));

                КонецЕсли;

                КонтекстФормы.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

               

                // заполним реквизит

                Запрос = Новый Запрос(

                «ВЫБРАТЬ

                |             ДатыКнигиПокупок.Дата

                |ИЗ

                |             РегистрСведений.ДатыКнигиПокупок КАК ДатыКнигиПокупок

                |ГДЕ

                |             ДатыКнигиПокупок.Документ = &Документ»);

                Запрос.УстановитьПараметр(«Документ», Объект.Ссылка);

                мТекст = «»;

                Выборка = Запрос.Выполнить().Выбрать();

                Пока Выборка.Следующий() Цикл

                               мТекст = мТекст + «;» + Формат(Выборка.Дата, «ДЛФ=D»);

                КонецЦикла;

                Если Лев(мТекст, 1) = «;» Тогда

                               мТекст = Сред(мТекст, 2);

                КонецЕсли;

                КонтекстФормы.Мув_ДатаОплаты = мТекст;

                // создание поля на форме

                СледующийРеквизит = КонтекстФормы.Элементы.Найти(ИмяСледующегоРеквизита);

                ГруппаДляВставки = КонтекстФормы.Элементы.Найти(ИмяГруппыВставки);

               

                Для Каждого эл из ДобавляемыеРеквизиты Цикл

                               НовыйЭлемент = КонтекстФормы.Элементы.Вставить(эл.Имя, Тип(«ПолеФормы»), ГруппаДляВставки, СледующийРеквизит);

                               НовыйЭлемент.ПутьКДанным = эл.Имя;

                               НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

                               НовыйЭлемент.Заголовок = «Даты оплаты»;

                КонецЦикла;

КонецПроцедуры

 

Функция ПривестиКДате (ДатаСтрокой, Формат)

                сГод = «»;

                сМесяц = «»;

                сДень = «»;

                сДлина = стрДлина(Формат);

                Для сч = 1 по сДлина Цикл

                               СимволФормата = Сред(Формат, сч, 1);

                               Если СимволФормата = «d» Тогда

                                               сДень = сДень + Сред(ДатаСтрокой, сч, 1);

                               ИначеЕсли СимволФормата = «M» Тогда

                                               сМесяц = сМесяц + Сред(ДатаСтрокой, сч, 1);

                               ИначеЕсли СимволФормата = «y» Тогда

                                               сГод = сГод + Сред(ДатаСтрокой, сч, 1);

                               КонецЕсли;

                КонецЦикла;

                Попытка

                               Результат = Дата(Число(сГод), Число(сМесяц), Число(сДень));

                Исключение

                               Результат = Неопределено;

                КонецПопытки;

                Возврат Результат;

КонецФункции

 

Процедура ПередЗаписьюНаСервере(КонтекстФормы, Отказ, ТекущийОбъект, ПараметрыЗаписи) Экспорт

                Если Отказ Тогда

                               Возврат;

                КонецЕсли;

                Попытка

                               МассивДатОплатКнигиПокупок = Новый Массив;

                               мСтрока = КонтекстФормы.Мув_ДатаОплаты;

                               мМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(мСтрока, «;», Ложь);

                               мТекст = «»;

                               Для Каждого эл из мМассив Цикл

                                               мДата = ПривестиКДате (эл, «dd.MM.yyyy»);

                                               МассивДатОплатКнигиПокупок.Добавить(мДата);

                                               нДата = Формат(мДата, «ДЛФ=D»);

                                               Если нДата <> эл Тогда

                                                               ВызватьИсключение «Ошибка форматы даты»;          

                                               КонецЕсли;

                                               мТекст = мТекст + «;» + Формат(нДата, «ДЛФ=D»);

                               КонецЦикла;

                               Если Лев(мТекст, 1) = «;» Тогда

                                               мТекст = Сред(мТекст, 2);

                               КонецЕсли;

                               КонтекстФормы.Мув_ДатаОплаты = мТекст;

                               ТекущийОбъект.ДополнительныеСвойства.Вставить(«МассивДатОплатКнигиПокупок», МассивДатОплатКнигиПокупок);

                Исключение

                               Отказ = Истина;

                               Сообщить(«Ошибка формата даты оплаты»);

                КонецПопытки;

КонецПроцедуры

 

результат:

мы имеем на форме текстовое поле, которое при записи документа сохраняется в виде нескольких строк в регистре, а при проведении корректируются проводки по регистру книги покупок.

 

Все бухи довольны, система надежна на отказ, обновление почти безболезнены…

 

has been added to your cart:
Оформление заказа