gifts2017

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

Опубликовал Тимофей Синичкин (TimofeySin) в раздел Программирование - Практика программирования

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

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

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

1) Подписи.

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

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

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

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

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

 

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

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

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

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

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

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

///Tima -

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

 

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

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

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

///RogaAndKopita  Tima -

 

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


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

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

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

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

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

 

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

 

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

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

 

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


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

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

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

 

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


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

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

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

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

http://infostart.ru/public/16980/

http://infostart.ru/public/183156/

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

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

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

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

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

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

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

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

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

#КонецЕсли

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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


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

http://infostart.ru/public/102078/

http://infostart.ru/public/99363/

http://infostart.ru/public/15195/

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

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

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

 

 

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение
Комментарии
1. Станислав Патырило (wondermaker) 10.09.13 07:20
1. Если меняется одна строка, то лучше писать комментарий в той же строке или перед ней.
Со временем таких изменений будет несколько и код может выглядеть как елка - всё зеленое от почти бессмысленных комментариев.
Да и причину писать надо. Бывает на одну строку кода пишешь 2-3 строки комментария.

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

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

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

3. Могу предложить еще вариант "триггеров" - некий справочник, в котором хранится код 1С, вызываемый в тех или иных случаях - динамическое изменение кода, универсальность встраивания.
Подписки хороши, если мы что-то делаем "по факту" и с целым объектом. А если нам надо в форме документа проверять реквизит на какие-то условия?
Если условий 5-10 штук, они меняются раз в месяц, да еще зависят от второй буквы девичьей фамилии матери отца соседа снизу пользователя?
Вот тут и пригодится такой внешний код - вызов займет 1-2 строки, при встраивании в типовую конфигурацию удобнее обновлять несколько строк, чем "километры" кода.

4. Для изменяемых объектов типовой конфигурации можно завести отдельную подсистему "ВрезкаВТиповую" и включать объекты в случае их изменения - это позволит в случае "врезок" либо исправления ошибок до выхода новой версии типовой фиксировать измененные объекты чтобы отслеживать их при обновлении.
gulagm; help1Ckr; +2 Ответить
2. Тимофей Синичкин (TimofeySin) 10.09.13 11:06
1 пункт, если в типовые модули делать минимум изменений то как елка код не будет выглядеть, а в доп модулях комментировать все не обязательно.
2 пункт да, видно надо было расширить в статье это.
3 пункт получается аналог внешнего модуля, просто изменения можно внедрять не залезая в конфигуратор. Такой вариант тоже имеет право на жизнь.
3. Сергей Ожерельев (Поручик) 10.09.13 15:47
(0) Шаблоны для вставки комментариев рулят
Шаблон общий
//[begin] Added by Sergey. http://infostart.ru/profile/18346/
//<?"", ДатаВремя, "ДЛФ=DT">
<?>
//[end] Added


Шаблон для проекта
//<exp/>
//Добавленные/изменённые строки
//Added by Sergey. <?"", ДатаВремя, "ДЛФ=DT">
<?>
//</exp>
...Показать Скрыть

Small sa; CratosX; gulagm; +3 Ответить
4. Евгений Сосна (pumbaE) 10.09.13 16:17
//TIMA 
а в английских версиях БСП писать ///ТИМА ?

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

А такие комментарии нафиг не нужны, т.к. они больше похожи на написанное на заборе "Сдесь был Вася!" , "Выпуск 1986г."...
alexsiswx; artbear; +2 Ответить
5. Олег Черкасов (oleg974) 11.09.13 07:57
Добавлю, что в начале модуля мы ставим еще и информацию о заявке по которой вносились изменения. Например:

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

и уже в модуле
// 1.01 Добавлено, начало
....
// 1.01 Добавлено, конец
help1Ckr; +1 Ответить
6. Саша Безымяный (help1Ckr) 11.09.13 09:30
(105) Gazza, "завести отдельную подсистему "ВрезкаВТиповую"" - я пришел к выводу о том, лучше делать следующую иерархию подсистем - первая МоиПодсистемы, и ей подчиненные МоиДобавленныеОбъекты, ОбъектыТиповойИзмененные,ИсправленныеОбъектыТиповойСОшибками.
В первую добавляем свои объекты - удобнее просматривать что добавлено, вторая подсистема позволяет контролировать а не слетели ли доработки, а третья контролировать глюки типовой которые в следующем релизе могут быть исправлены.
7. Саша Безымяный (help1Ckr) 11.09.13 09:32
(105) Gazza, не согласен. Когда есть список заявок и в комментах писать не вася, а №заявки такой. то потом можно: а) узнать зачем вносились изменения и с какими объектами они связаны; б) проще искать изменения;
8. ddd ddd (alexsiswx) 12.09.13 11:39
Правильно отмечено! "обновлять конфигурацию поставщика" - обязательно.
9. Игорь Фрунзэ (gorodok11) 16.01.14 15:11
//--> I.F. Проведение будущей датой
Процедура ОбработчикИзмененияДаты(Данные)
    Если Данные="ДокументОбъект.Дата" ИЛИ Данные="" Тогда
        Если Дата>ТекущаяДата() Тогда
            ЭтаФорма.ИспользоватьРежимПроведения=ИспользованиеРежимаПроведения.НеОперативный;
        Иначе
            ЭтаФорма.ИспользоватьРежимПроведения=ИспользованиеРежимаПроведения.Оперативный;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры 
//<-- I.F. Проведение будущей датой
//...
////////////////////////////////////////////////////////////­////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
//...
//--> I.F. Проведение будущей датой
ПодключитьОбработчикИзмененияДанных("Дата","ОбработчикИзмененияДаты");
//<-- I.F. Проведение будущей датой






...Показать Скрыть
10. Александр Полтава (Патриот) 25.04.14 13:42
Сакральные знания)) хотя для новичков может и полезно