Перепроведение изменённых документов. Часть II.

Первая мысль – анализировать документ в момент записи, и в зависимости от того, что было изменено, принимать решение: перепроводить насильно, или без этого можно обойтись. Первое решение, пришедшее в голову было таким: нужно отлавливать момент изменения реквизита, и в зависимости от того, какой реквизит – изменять (или не изменять) некую переменную формы документа. В процедуре ПриЗаписи() анализировать эту переменную, и, в зависимости от ее состояния, разрешать или запрещать сохранение без перепроведения.

П ервая статья принесла один отклик, однако он оказался настолько концептуальным, что пришлось сесть за написание второй части. У новой технологии нет ни одного из недостатков, упомянутых в первой статье. Кроме того, описанную идею можно использовать и в других целях. Например, для организации детального журналирования изменений БД, совершенных пользователем.

автор статьи: Фёдор Езеев
fe@alterplast.ru
опубликовано: апрель 2003

Первая мысль – анализировать документ в момент записи, и в зависимости от того, что было изменено, принимать решение: перепроводить насильно, или без этого можно обойтись.

Первое решение, пришедшее в голову было таким: нужно отлавливать момент изменения реквизита, и в зависимости от того, какой реквизит – изменять (или не изменять) некую переменную формы документа. В процедуре ПриЗаписи() анализировать эту переменную, и, в зависимости от ее состояния, разрешать или запрещать сохранение без перепроведения.

Однако, уважаемый Mx@mail.ru и здесь проявил могучий разум, он предложил еще одну здравую мысль (просто результат он знал заранее ;-). Мысль такая: в момент записи у нас есть один документ в двух состояниях, которые можно довольно просто сравнить. Первое состояние – Контекст документа. Это то, что получилось после внесения изменений. Второе состояние –- записанный документ в базе данных.

Теория кончилась – берем в руки клавиатуру и пишем код. Начнем с анализа реквизитов шапки.

//Берем документ из БД
Д=СоздатьОбъект("Документ");
Д.НайтиДокумент(ТекущийДокумент());

МетаД=Метаданные.Документ(Вид());

//Определим, изменился реквизит, или нет
Для С=1 По МетаД.РеквизитШапки() Цикл
   РеквИД=МетаД.РеквизитШапки(С).Идентификатор;
   СтароеЗначение=Д.ПолучитьАтрибут(РеквИД);
   НовоеЗначение=ПолучитьАтрибут(РеквИД);
   Если СтароеЗначение<>НовоеЗначение Тогда
      Сообщить("Изменился реквизит шапки "+РеквИД);
      Сообщить("Старое значение: "+СтароеЗначение);
      Сообщить("Новое значение: "+НовоеЗначение);
      Сообщить("===============================");
   КонецЕсли;
КонецЦикла;

Теперь я хочу понять, насколько критичны сделанные изменения. И сообщить только о критичных.

// В список значений занесем идентификаторы тех реквизитов,
// изменение которых нас не волнует


Косметика=СоздатьОбъект("СписокЗначений");
Косметика.ДобавитьЗначение("Комментарий");
Косметика.ДобавитьЗначение("Автор");

Д=СоздатьОбъект("Документ");
Д.НайтиДокумент(ТекущийДокумент());

МетаД=Метаданные.Документ(Вид());

Для С=1 По МетаД.РеквизитШапки() Цикл
   РеквИД=МетаД.РеквизитШапки(С).Идентификатор;
Если Косметика.НайтиЗначение(РеквИД)>0 Тогда
      Продолжить;
   КонецЕсли;

   СтароеЗначение=Д.ПолучитьАтрибут(РеквИД);
   НовоеЗначение=ПолучитьАтрибут(РеквИД);
   Если СтароеЗначениеНовоеЗначение Тогда
      Сообщить("Изменился реквизит шапки "+РеквИД);
      Сообщить("Старое значение: "+СтароеЗначение);
      Сообщить("Новое значение: "+НовоеЗначение);
      Сообщить("===============================");
   КонецЕсли;
КонецЦикла;

Ну и в заключение на основании сделанного анализа примем нужное нам решение.

Процедура ПриЗаписи()

Если Выбран()=0 Тогда
Возврат;
КонецЕсли;

Косметика=СоздатьОбъект("СписокЗначений");
Косметика.ДобавитьЗначение("Комментарий");
Косметика.ДобавитьЗначение("Автор");
ИзменениеКритично=0;

Д=СоздатьОбъект("Документ");
Д.НайтиДокумент(ТекущийДокумент());
МетаД=Метаданные.Документ(Вид());

Для С=1 По МетаД.РеквизитШапки() Цикл
   РеквИД=МетаД.РеквизитШапки(С).Идентификатор;
   Если Косметика.НайтиЗначение(РеквИД)>0 Тогда
      Продолжить;
   КонецЕсли;
   СтароеЗначение=Д.ПолучитьАтрибут(РеквИД);
   НовоеЗначение=ПолучитьАтрибут(РеквИД);
   Если СтароеЗначение<>НовоеЗначение Тогда
      ИзменениеКритично=1;
//Одного критичного изменения вполне достаточно
      Возврат;

   КонецЕсли;
КонецЦикла;

Если ИзменениеКритично=0 Тогда
   ПриЗаписиПерепроводить(0);
   Записать();
   ПриЗаписиПерепроводить(1);
   СтатусВозврата(0);Возврат;
КонецЕсли;


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

Общая картина ясна. Осталось только дописать анализ общих реквизитов и табличной части документа. Проблема может возникнуть разве что со сравнением табличной части. Тут главное – не забыть о том, что кроме изменения строк бывает еще и удаление и добавление.

Кусочек, сравнивающий строки, будет выглядеть примерно так (предполагаем, что любое изменение табличной части требует перепроведения):

Если КоличествоСтрок()<>Д.КоличествоСтрок() Тогда
   ИзменениеКритично=1;
   Возврат;
Иначе
   ВыбратьСтроки();
   Пока ПолучитьСтроку()=1 Цикл
      Д.ПолучитьСтрокуПоНомеру(НомерСтроки);
      Для С=1 По МетаД.РеквизитТабличнойЧасти() Цикл
         РеквИД=МетаД.РеквизитТабличнойЧасти(С).Идентификатор;
         СтароеЗначение=Д.ПолучитьАтрибут(РеквИД);
         НовоеЗначение=ПолучитьАтрибут(РеквИД);
         Если СтароеЗначение<>НовоеЗначение Тогда
            ИзменениеКритично=1;
            Возврат;
         КонецЕсли;
      КонецЦикла;
   КонецЦикла;
КонецЕсли;

Преимуществами этого метода можно признать:

  1. Прозрачность для пользователя.
  2. Размещение кода, ответственного за одну задачу в одном месте.
  3. Отсутствие "каскада записей" при изменении сразу нескольких "неважных" реквизитов.
Ну и еще раз хочется упомянуть, что данную методику можно с успехом применять для детального журналирования действий пользователя.

Начать дискуссию

Социальные предприниматели зарабатывают в РФ миллиарды: какие это сферы деятельности

Выручка индивидуальных предпринимателей, который работают в социальной сфере, составила 17,9 млрд рублей, а юридических лиц — 84,6 млрд.

Курсы повышения
квалификации

20
Официальное удостоверение с занесением в госреестр Рособрнадзора
Банки

Вклады теперь застрахованы более надежно

Размер повышенной дополнительной ставки составит 300% от базовой. С первого квартала 2022 года дополнительная ставка была нулевой.

❗ Минюст зарегистрировал изменение правил заполнения уведомлений по ЕНП

Порядок заполнения ЕНП-уведомления и электронный формат этого документа обновили. Новые правила заработают со 2 мая. Впрочем, их применяют и сейчас.

5
Лучшие спикеры, новый каждый день

С 1 мая новые контрольные соотношения в отчетности! 👀«Ночной бухгалтер» № 1670

Да, сверять отчеты между собой нужно будет по-новому. И следить за ними надо в оба глаза, потому что, если ваша декларация какие-то из них не пройдет, то и суммы из нее не будут учтены на ЕНС, придется ждать окончания камералки.

Иллюстрация: Вера Ревина / Клерк.ру
Общество

Шашлык подорожал на 10-20%. Опрос

Заметнее всего подорожал шашлык из курицы. Стоимость блюда выросла на 20%, до 389 рублей.

Мишустин: доходы бюджета выросли более чем на 50%

Минэкономразвития ждет, что за 2024 год ВВП превысит 191 трлн рублей, реальные доходы населения вырастут на 5,3%, а безработица сохранится в пределах 3%.

Опытом делятся эксперты-практики, без воды
Адвокат

👔 Новый закон ужесточил требования к адвокатам, и будет их единый реестр. Сами адвокаты приветствуют это и считают крайне полезным

Президент подписал изменения в федеральный закон «Об адвокатской деятельности и адвокатуре в РФ».

Правительство на 7 лет продлит выплаты многодетным на погашение ипотеки

В 2024 году многодетные получат порядка 50 млрд рублей на погашение жилищного кредита.

С 1 мая банкам запретили брать комиссию за переводы клиента самому себе

Все банки с 1 мая 2024 года должны отменить комиссию с переводов до 30 млн рублей между собственными счетами клиента, в том числе в разных банках.

⚡️ Итоги дня: школьников научат управлять беспилотниками, золото упало в цене, а в России сделали люксовую машину на водородном топливе

Подготовили обзор главных событий дня. Все самое интересное, что писали и обсуждали в сети, в одной подборке.

Бесплатно с Отпуска

Можно ли брать отпуск, разбивая его по несколько дней, в частности между праздниками. Мини-курс

Можно ли разделить отпуск, и какими частями работник может использовать дни отпуска, разбираем в сегодняшнем мини-курсе.

Можно ли брать отпуск, разбивая его по несколько дней, в частности между праздниками. Мини-курс
Бесплатно с Защита персональных данных

Штрафы за нарушения по персональным данным в 2024 году

В 2024 году штрафы за нарушение работы с персональными данными могут составлять до 1,5 млн руб., появились и новые составы правонарушений. Рассмотрим, как и на что обратить внимание, чтобы избежать миллионных санкций. 

Штрафы за нарушения по персональным данным в 2024 году
Миникурсы, текстовые и видеоинструкции для бухгалтеров

9 менеджеров, которые приведут вашу компанию в проектный ад

Есть мнение, что менеджер проекта — это самая неблагодарная и недооцененная позиция в IT. Ты оказываешься между двух огней и отвечаешь за все происходящее, но именно менеджер проекта — фигура, которая задает настроение команде.

9 менеджеров, которые приведут вашу компанию в проектный ад

Что нового в правилах работы с электронными больничными

Электронные больничные стали обязательными, бумажных листков нетрудоспособности больше нет. С 1 мая 2024 года меняются правила работы с электронными больничными листами. На основании принятых изменений, запрашивать информацию из электронных больничных в СФР будет возможно только при наличии машиночитаемой доверенности, выданной страхователем.

Иллюстрация: Вера Ревина/Клерк.ру

С 1 мая очередной вид продуктов питания подлежит обязательной маркировке

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

Фриланс, аутстаффинг, аутсорсинг: что это за модели и как бизнесу выбрать подходящую

Растущая необходимость в гибкости и эффективности решения задач ставит перед компаниями вопрос выбора между фрилансом, аутстаффингом и аутсорсингом. Модели предлагают решения для внешнего выполнения работ, но как определить, какая подходит бизнесу лучше?

 Иллюстрация: создано с помощью ИИ OpenAI © Вера Ревина/Клерк.ру

Учет убытков в 2024 году

К сожалению, не всегда компаниям удается получить желаемую прибыль. Что делать, если расходы превысили полученные организацией доходы? Как списать полученные убытки и предотвратить возможные претензии проверяющих, рассмотрим в этой статье.

Иллюстрация: Вера Ревина/Клерк.ру

Компании из каких сфер активнее всего инвестируют на бирже: результаты исследования

За год суммарный доход компаний-клиентов Тинькофф на Мосбирже превысил 1 млрд рублей. Самые активные инвесторы на бирже — компании из оптовой торговли, строительства и химической отрасли.

КоАП РФ

Бизнесу поднимут штрафы за отсутствие уведомлений о начале предпринимательской деятельности

Власти хотят на 145% поднять размер административного штрафа для бизнесменов, которые не сообщают о своей деятельности. Санкции не менялись с 2010 года.

Интересные материалы

ВЭД

Валютная оговорка в договоре

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

Иллюстрация: freepik/freepik