Стандартизация внесения изменений в конфигурацию

Общие рекомендации по внесению изменений в конфигурацию для последующего облегчения обновления.
Рекомендации по подписям, добавление реквизитов, модулей, форм, процедур…

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

Вот несколько наработок и правил, которые в этом помогают:

1) Подписи.

Все мы обычно подписываемся так:

///Тима   — Тима для примера, может быть вася петя инициалы итд

Но это не совсем верно: если в глобальном поиске набрать «Тима», то вылезет куча не нужных вещей, например «Функция дкПривестиМакетПечатнойФормы(ЭтотОбъект,Макет)». (Хотя можно искать и «/Тима»

поэтому лучше подписываться латинскими буквами!

Дальше нам надо, к примеру, изменить знак в строке)

 

Переменная = Переменная - 1; ///TIMA

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

И если вы изменяете целый блог то лучше еще вставить начало изменений и конец изменений.:

///Tima +++ (а лучше и написать дату изменения, чтоб было легче вспоминать) 230813

///Переменная = Переменная + 1;

Переменная = Переменная - 1;

///Tima -

Также если работает несколько человек над одной конфигурации, то перед именем в подписи вставьте что-то общее, например имя организации,  для которой вы все это меняете:

 

///RogaAndKopita Tima +++ (а лучше и написать дату изменения, чтоб было легче вспоминать) 230813

///Переменная = Переменная + 1;

Переменная = Переменная - 1;

///RogaAndKopita  Tima -

 

2) Подписки на события!


Ну конечно же во-первых и во-вторых используйте Подписки на события.

Все события, которые можно поместить в

ПриУстановкеНовогоНомера, ПриКопировании, ОбработкаЗаполнения, ПередЗаписью, ПриЗаписи, ПередУдалением, ОбработкаПроведения, ОбработкаУдаленияПроведения, ОбработкаПроверкиЗаполнения.

Помещайте в Подписки на события

Порядок выполнения подписки на событие не регламентирован, пишите код исходя из этого.

 

3) Добавление реквизитов, модулей, форм итд

 

Все новые объекты конфигурации добавляете с префиксом (например,  «Dop_» или «RogaAndKopita_» или «Tima_»).

То же самое касается и новых функций или процедур.

 

4) Добавление новых процедур


Все новыее процедуры и функции добавляете в СВОЙ общий модуль, по возможности не трогайте типовые!

Старайтесь как можно больше процедур и функций помещать в СВОЙ общий модуль, вы себе этим здорово облегчите жизнь.

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

 

5) Изменения в формах.


Если хотите изменить события формы или обработки реквизитов, то есть 2 способа

Первый способ.

Если хотите изменить события формы или обработки реквизитов, то есть 2 способа

Механизм  переопределения событий форм:

//infostart.ru/public/16980/

//infostart.ru/public/183156/

Если вкратце, то так:

В общий модуль добавляем процедуру:

#Если Клиент Тогда
//ПЕРЕОПРЕДЕЛЕНИЕ ФУНКЦИЙ ФОРМ
// Переопределяет обработчик события формы.
// Сохраняет штатный обработчик события внутри формы и устанавливает новый.
//
// Параметры:
//  пФорма       – Форма – форма;
//  *пИмяСобытия – Строка – имя события;
//  *пИмяЭлементаФормы – Строка – полное имя элемента формы.
//  *пЛиИсключительное – Булево – сообщать о наличии старого обработчика;
//  *пПсевдонимЭлементаФормы – Строка – псевдоним элемента формы, используется для назначения одного обработчика
//               для нескольких однотипных событий формы.
//
Процедура допУстановитьДействиеФормы(пФорма, пИмяСобытия = "", пИмяЭлементаФормы = "",
пЛиИсключительное = Ложь, пПсевдонимЭлементаФормы = "") Экспорт

Если пИмяЭлементаФормы <> "" Тогда
МассивФрагментов = допРазложитьСтроку(пИмяЭлементаФормы,".",1);
ИмяЭлементаФормы = МассивФрагментов[0];
Объект = пФорма.ЭлементыФормы[ИмяЭлементаФормы];
Если МассивФрагментов.Количество() > 1 Тогда
ИмяЭлементаФормы = ИмяЭлементаФормы + МассивФрагментов[1];
Если ТипЗнч(Объект) = Тип("ТабличноеПоле") Тогда
Объект = Объект.Колонки[МассивФрагментов[1]].ЭлементУправления;
ИначеЕсли ТипЗнч(Объект) = Тип("КоманднаяПанель") Тогда
Объект = Объект.Кнопки[МассивФрагментов[1]];
КонецЕсли;
КонецЕсли;
Иначе
Объект = пФорма;
ИмяЭлементаФормы = "";
КонецЕсли;

ТекстМаркера = "рСтарыеОбработчики";
Если пФорма.ЭлементыФормы.Найти(ТекстМаркера) = Неопределено Тогда
пФорма.ЭлементыФормы.Добавить(Тип("ПолеВвода"), ТекстМаркера, Ложь);
КонецЕсли;

Если пПсевдонимЭлементаФормы <> "" Тогда
ПолноеИмяСобытия = пПсевдонимЭлементаФормы + пИмяСобытия;
Иначе
ПолноеИмяСобытия = ИмяЭлементаФормы + пИмяСобытия;
КонецЕсли;

Если ТипЗнч(Объект) = Тип("КнопкаКоманднойПанели") Тогда
СтароеДействие = Объект.Действие;
Иначе
СтароеДействие = Объект.ПолучитьДействие(пИмяСобытия);
КонецЕсли;

Если пЛиИсключительное и СтароеДействие <> Неопределено Тогда
Сообщить("Конфликт обработчиков события """ + пИмяСобытия + """ объекта """ + Строка(Объект) + """",
СтатусСообщения.Важное);
КонецЕсли;
ИмяДействия="доп"+ПолноеИмяСобытия;
НовоеДействие=Новый Действие(ИмяДействия);
// Для отладки здесь следует отключать попытку. Она используется для назначения унифицированных обработчиков,
// наличие которых не является обязательным.
Попытка
Если ТипЗнч(Объект) = Тип("КнопкаКоманднойПанели") Тогда
Объект.Действие = НовоеДействие;
Иначе
Объект.УстановитьДействие(пИмяСобытия, НовоеДействие);
КонецЕсли;
Исключение
Возврат;
КонецПопытки;

СписокСоответствияОбработчиков = пФорма.ЭлементыФормы.рСтарыеОбработчики.СписокВыбора;
СписокСоответствияОбработчиков.Добавить(ИмяЭлементаФормы + "." + пИмяСобытия, СтароеДействие);

КонецПроцедуры // допУстановитьДействиеФормы()

// Определяет корневой тип конфигурации.
//
// Параметры:
//  пЗначение    – Произвольный – проверяемое значение.
//
// Возвращаемое значение:
//  Строка       – имя корневого типа конфигурации метаданных;
//  Неопределено – значение не является объектом коневого типа конфигурации.
//
Функция допПолучитьКорневойТипКонфигурации(пЗначение) Экспорт

ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(пЗначение));
Если ОбъектМетаданных <> Неопределено Тогда
МассивФрагментов = допРазложитьСтроку(ОбъектМетаданных.ПолноеИмя(),".",1);
Если МассивФрагментов.Количество() = 2 Тогда
Возврат МассивФрагментов[0];
Иначе
// Ссылка на субобъект
КонецЕсли;
КонецЕсли;
Возврат Неопределено;

КонецФункции // допПолучитьКорневойТипКонфигурации()

// Получаем стандартную строку аргументов для выполнения вызова обработчика события формы.
//
// Параметры:
//  пОбъект      – Форма, ЭлементФормы – объект события;
//  *пИмяСобытия – Строка – имя события.
//
// Возвращаемое значение:
//               – Строка – строка аргументов вида "([Аргумент1][, Аргумент2, ... , АргументN]);",
//               где аргументы имеют свои стандартные названия для каждого события.
//
Функция допПолучитьАргументыДействияФормы(пОбъект, пИмяСобытия = "")
Аргументы = "";
Если ТипЗнч(пОбъект) = Тип("КнопкаКоманднойПанели") Тогда
// Это действие кнопки командной панели формы
Аргументы = "(Кнопка)";
ИначеЕсли ТипЗнч(пОбъект) = Тип("Форма") Тогда
// Это событие формы
Попытка
ОбъектОсновнойРеквизитФормы = пОбъект.ЭтотОбъект;
Исключение
ОбъектОсновнойРеквизитФормы = Неопределено;
КонецПопытки;
Если Аргументы = "" Тогда
Если  пИмяСобытия = "ВнешнееСобытие" Тогда
Аргументы = "(Источник, Событие, Данные)";
ИначеЕсли пИмяСобытия = "ОбработкаАктивизацииОбъекта" Тогда
Аргументы = "(АктивныйОбъект, Источник)";
ИначеЕсли пИмяСобытия = "ОбработкаВыбора" Тогда
Аргументы = "(ЗначениеВыбора, Источник)";
ИначеЕсли пИмяСобытия = "ОбработкаЗаписиНовогоОбъекта" Тогда
Аргументы = "(Объект, Источник)";
ИначеЕсли пИмяСобытия = "ОбработкаОповещения" Тогда
Аргументы = "(ИмяСобытия, Параметр, Источник)";
ИначеЕсли пИмяСобытия = "ПередЗакрытием" Тогда
Аргументы = "(Отказ, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "ПередЗаписью" Тогда
Если допПолучитьКорневойТипКонфигурации(ОбъектОсновнойРеквизитФормы) = "Документ" Тогда
Аргументы = "(Отказ, РежимЗаписи, РежимПроведения)";
Иначе
Аргументы = "(Отказ)";
КонецЕсли;
ИначеЕсли пИмяСобытия = "ПередОткрытием" Тогда
Аргументы = "(Отказ, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "ПриЗаписи" Тогда
Аргументы = "(Отказ)";
ИначеЕсли пИмяСобытия = "ПриПовторномОткрытии" Тогда
Аргументы = "(СтандартнаяОбработка)";
Иначе
Аргументы = "()";
КонецЕсли;
КонецЕсли;
Иначе
// Это событие элемента формы
Если ТипЗнч(пОбъект) = Тип("ТабличноеПоле") Тогда
Если пИмяСобытия = "Выбор" Тогда
Аргументы = "(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "Перетаскивание" Тогда
Аргументы = "(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)";
ИначеЕсли пИмяСобытия = "ПроверкаПеретаскивания" Тогда
Аргументы = "(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)";
КонецЕсли;
ИначеЕсли ТипЗнч(пОбъект) = Тип("ТабличныйДокумент") Тогда
Если пИмяСобытия = "Выбор" Тогда
Аргументы = "(Элемент, Область, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "Перетаскивание" Тогда
Аргументы = "(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Область)";
ИначеЕсли пИмяСобытия = "ПроверкаПеретаскивания" Тогда
Аргументы = "(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Область)";
КонецЕсли;
КонецЕсли;
Если Аргументы = "" Тогда
Если пИмяСобытия = "АвтоПодборТекста" Тогда
Аргументы = "(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "НачалоВыбора" Тогда
Аргументы = "(Элемент, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "НачалоПеретаскивания" Тогда
Аргументы = "(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "ОбработкаВыбора" Тогда
Аргументы = "(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "ОбработкаЗаписиНовогоОбъекта" Тогда
Аргументы = "(Элемент, Объект, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "ОбработкаРасшифровки" Тогда
Аргументы = "(Элемент, Расшифровка, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "ОкончаниеВводаТекста" Тогда
Аргументы = "(Элемент, Текст, Значение, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "ОкончаниеПеретаскивания" Тогда
Аргументы = "(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "Открытие" Тогда
Аргументы = "(Элемент, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "Очистка" Тогда
Аргументы = "(Элемент, СтандартнаяОбработка)";
ИначеЕсли пИмяСобытия = "ПередНачаломДобавления" Тогда
Аргументы = "(Элемент, Отказ, Копирование)";
ИначеЕсли пИмяСобытия = "ПередНачаломИзменения" Тогда
Аргументы = "(Элемент, Отказ)";
ИначеЕсли пИмяСобытия = "ПередОкончаниемРедактирования" Тогда
Аргументы = "(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)";
ИначеЕсли пИмяСобытия = "ПередУдалением" Тогда
Аргументы = "(Элемент, Отказ)";
ИначеЕсли пИмяСобытия = "ПриВыводеСтроки" Тогда
Аргументы = "(Элемент, ОформлениеСтроки, ДанныеСтроки)";
ИначеЕсли пИмяСобытия = "ПриИзмененииСодержимогоОбласти" Тогда
Аргументы = "(Элемент, Область)";
ИначеЕсли пИмяСобытия = "ПриНачалеРедактирования" Тогда
Аргументы = "(Элемент, НоваяСтрока, Копирование)";
ИначеЕсли пИмяСобытия = "ПриОкончанииРедактирования" Тогда
Аргументы = "(Элемент, НоваяСтрока, ОтменаРедактирования)";
ИначеЕсли пИмяСобытия = "ПриОкончанииРедактированияИнтервала" Тогда
Аргументы = "(Элемент, Интервал, Отмена)";
ИначеЕсли пИмяСобытия = "ПриПолученииДанных" Тогда
Аргументы = "(Элемент, ОформленияСтрок)";
ИначеЕсли пИмяСобытия = "ПриСменеСтраницы" Тогда
Аргументы = "(Элемент, ТекущаяСтраница)";
ИначеЕсли пИмяСобытия = "Регулирование" Тогда
Аргументы = "(Элемент, Направление, СтандартнаяОбработка)";
Иначе
Аргументы = "(Элемент)";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Аргументы + ";";

КонецФункции // допПолучитьАргументыДействияФормы()

// Получаем текст для выполнения вызова старого обработчика события формы или элемента формы.
//
// Параметры:
//  пФорма       – Форма – форма;
//  *пИмяСобытия – Строка – имя события;
//  *пИмяЭлементаФормы – Строка – полное имя элемента формы.
//
// Возвращаемое значение:
//               – Строка – текст для выполнения.
//
Функция допПолучитьСтароеДействиеФормы(пФорма, пИмяСобытия = "", пИмяЭлементаФормы = "") Экспорт
Если пИмяЭлементаФормы <> "" Тогда
МассивФрагментов = допРазложитьСтроку(пИмяЭлементаФормы,".",1);
ИмяЭлементаФормы = МассивФрагментов[0];
Объект = пФорма.ЭлементыФормы[ИмяЭлементаФормы];
Если МассивФрагментов.Количество() > 1 Тогда
ИмяЭлементаФормы = ИмяЭлементаФормы + МассивФрагментов[1];
Если ТипЗнч(Объект) = Тип("ТабличноеПоле") Тогда
Объект = Объект.Колонки[МассивФрагментов[1]].ЭлементУправления;
ИначеЕсли ТипЗнч(Объект) = Тип("КоманднаяПанель") Тогда
Объект = Объект.Кнопки[МассивФрагментов[1]];
КонецЕсли;
КонецЕсли;
Иначе
ИмяЭлементаФормы = "";
Объект = пФорма;
КонецЕсли;

СтарыйОбработчик = "";
СписокСоответствияОбработчиков = пФорма.ЭлементыФормы.рСтарыеОбработчики.СписокВыбора;
ЭлементСписка = СписокСоответствияОбработчиков.НайтиПоЗначению(ИмяЭлементаФормы + "." + пИмяСобытия);
Если ЭлементСписка <> Неопределено Тогда
СтарыйОбработчик = ЭлементСписка.Представление;
КонецЕсли;
Если СтарыйОбработчик <> "" Тогда
СтарыйОбработчик = СтарыйОбработчик + допПолучитьАргументыДействияФормы(Объект, пИмяСобытия);
КонецЕсли;

Возврат СтарыйОбработчик;
КонецФункции // допПолучитьСтароеДействиеФормы()

#КонецЕсли

В модуле формы, в конце пишем:

допУстановитьДействиеФормы(ЭтаФорма, "ПриОткрытии");

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

Процедура ДопПриОткрытии()

///Сюда вставляем что хотим до

Выполнить(допПолучитьСтароеДействиеФормы(ЭтаФорма, "ПриОткрытии"));

///Сюда тоже можно вставлять

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

 

Второй способ.

Позаимствовал у компании Рарус обработку реквизитов: в модуле формы во все требуемые процедуры пишем строчку:

///Если Обрабатываем ТабЧасть:
ОбработкаРеквизита("ИмяТабЧасти.ИмяРекизита", ЭлементыФормы.ИмяТабЧасти.ТекущаяСтрока, ЭтаФорма);
///Если обрабатываем реквизит формы или событие:
ОбработкаРеквизита("ИмяРекизита", , ЭтаФорма);

А в модуле документа делаем:
Функция ОбработкаРеквизита(Имя,ТекСтрока=Неопределено,ЭтаФорма=Неопределено,ДопПараметры=Неопределено) Экспорт

Если имя = "ИмяРекизита" тогда

ИначеЕсли имя = "ИмяРекизитаДругого" тогда
//А если надо вызвать обработку другого реквизита при выполнении кода это делается легко:

возврат ОбработкаРеквизита("ИмяРекизита", , ЭтаФорма);

Иначе
//// А тут можно сделать вызов такой же функции в общем модуле для изменения общих реквизитов (например ставка НДС)
Возврат ДопОбработкаРеквизита(Имя,ТекСтрока,ЭтаФорма,ДопПараметры);
КонецЕсли;

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

6) Изменение самой формы


Если нужно изменить саму форму, например добавить реквизит или еще что-то, можно использовать декомпилятор форм:

//infostart.ru/public/102078/

//infostart.ru/public/99363/

//infostart.ru/public/15195/

А код из декомпилятора вставлять в процедуру ПриОткрытии (конечно с учетом 5-го пункта)

А вот если требуется сильно переделать всю форму, то советую создавать новую форму, тогда при обновлении всего лишь переопределится форма по умолчанию, а все ваши изменения не потеряются.
 

Вот собственно и все приемы, которые я знаю. Если знаете еще способы, то пишите, обязательно их добавлю.

 

 

10 Comments

  1. wondermaker

    1. Если меняется одна строка, то лучше писать комментарий в той же строке или перед ней.

    Со временем таких изменений будет несколько и код может выглядеть как елка — всё зеленое от почти бессмысленных комментариев.

    Да и причину писать надо. Бывает на одну строку кода пишешь 2-3 строки комментария.

    Переменная = Переменная — 1; ///RogaAndKopita Tima +++ вместо «+» будет «-» потому что <причина действий> 230813

    2. Все новые процедуры и функции добавляете в СВОЙ общий модуль, по возможности не трогайте типовые!

    Частично согласен. Но я бы советовал не один модуль, а несколько. Разделить их, во-первых, по направлениям/участкам работы. Во-вторых, на клиентскую и серверную часть.

    И не стоит скидывать со счетов модули менеджеров — очень полезная вещь, особенно, если функция или процедура работает только с одним видом объекта конфигурации.

    3. Могу предложить еще вариант «триггеров» — некий справочник, в котором хранится код 1С, вызываемый в тех или иных случаях — динамическое изменение кода, универсальность встраивания.

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

    Если условий 5-10 штук, они меняются раз в месяц, да еще зависят от второй буквы девичьей фамилии матери отца соседа снизу пользователя?

    Вот тут и пригодится такой внешний код — вызов займет 1-2 строки, при встраивании в типовую конфигурацию удобнее обновлять несколько строк, чем «километры» кода.

    4. Для изменяемых объектов типовой конфигурации можно завести отдельную подсистему «ВрезкаВТиповую» и включать объекты в случае их изменения — это позволит в случае «врезок» либо исправления ошибок до выхода новой версии типовой фиксировать измененные объекты чтобы отслеживать их при обновлении.

    Reply
  2. TimofeySin

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

    2 пункт да, видно надо было расширить в статье это.

    3 пункт получается аналог внешнего модуля, просто изменения можно внедрять не залезая в конфигуратор. Такой вариант тоже имеет право на жизнь.

    Reply
  3. Поручик

    (0) Шаблоны для вставки комментариев рулят

    Шаблон общий

    //[begin] Added by Sergey. http://infostart.ru/profile/18346/
    //<?»», ДатаВремя, «ДЛФ=DT»>
    <?>
    //[end] Added

    Шаблон для проекта

    //<exp/>
    //Добавленные/изменённые строки
    //Added by Sergey. <?»», ДатаВремя, «ДЛФ=DT»>
    <?>
    //</exp>

    Reply
  4. pumbaE
    //TIMA 

    а в английских версиях БСП писать ///ТИМА ?

    Главное обновляй конфу поставщика нормально и все твои врезки будут видны и понятны ибо никакие комментарии не помогут понять, что же цензура сделали в этой конфе, где версия cf 3.0.2, а версия поставщика 1.0.1 …

    А такие комментарии нафиг не нужны, т.к. они больше похожи на написанное на заборе «Сдесь был Вася!» , «Выпуск 1986г.»…

    Reply
  5. oleg974

    Добавлю, что в начале модуля мы ставим еще и информацию о заявке по которой вносились изменения. Например:

    // 1.01 10.09.2013 Иванов И.И. по заявке 235 добавил вариант заполнения контрагента

    и уже в модуле

    // 1.01 Добавлено, начало

    ….

    // 1.01 Добавлено, конец

    Reply
  6. help1Ckr

    (105) Gazza, «завести отдельную подсистему «ВрезкаВТиповую»» — я пришел к выводу о том, лучше делать следующую иерархию подсистем — первая МоиПодсистемы, и ей подчиненные МоиДобавленныеОбъекты, ОбъектыТиповойИзмененные,ИсправленныеОбъектыТиповойСОшибками.

    В первую добавляем свои объекты — удобнее просматривать что добавлено, вторая подсистема позволяет контролировать а не слетели ли доработки, а третья контролировать глюки типовой которые в следующем релизе могут быть исправлены.

    Reply
  7. help1Ckr

    (105) Gazza, не согласен. Когда есть список заявок и в комментах писать не вася, а №заявки такой. то потом можно: а) узнать зачем вносились изменения и с какими объектами они связаны; б) проще искать изменения;

    Reply
  8. alexsiswx

    Правильно отмечено! «обновлять конфигурацию поставщика» — обязательно.

    Reply
  9. madmpro
    //—> I.F. Проведение будущей датой
    Процедура ОбработчикИзмененияДаты(Данные)
    Если Данные=»ДокументОбъект.Дата» ИЛИ Данные=»» Тогда
    Если Дата>ТекущаяДата() Тогда
    ЭтаФорма.ИспользоватьРежимПроведения=ИспользованиеРежимаПроведения.НеОперативный;
    Иначе
    ЭтаФорма.ИспользоватьРежимПроведения=ИспользованиеРежимаПроведения.Оперативный;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
    //<— I.F. Проведение будущей датой
    //…
    ////////////////////////////////////////////////////////////­////////////////////
    // ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
    //…
    //—> I.F. Проведение будущей датой
    ПодключитьОбработчикИзмененияДанных(«Дата»,»ОбработчикИзмененияДаты»);
    //<— I.F. Проведение будущей датой
    
    
    
    
    
    
    

    Показать

    Reply
  10. Патриот

    Сакральные знания)) хотя для новичков может и полезно

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *