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

09.09.13

Архитектура

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

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

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

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-го пункта)

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

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

 

 

См. также

Отчеты и дашборды Бесплатно (free)

После года интенсивной работы в управленческой базе 1С накапливается большое количество информации. Алчные до анализа аналитики загружают разработчиков 1С большим объемом работ по созданию разных отчетов из базы данных. Это нужно, чтобы получить крупицы «золотой» информации, необходимой для принятия правильного управленческого решения. Как результат, загружены разработчики, нагружено железо, перегружены регистры, чешут голову администраторы по железу..... бюджет поддержки такой системы летит к небесам… Расскажем о том, как выгрузить данные из 1С в BI и передать настройку произвольных отчетов в руки аналитиков и юниор разработчиков, чтобы они сами могли вывести отчеты и взаимосвязи с помощью Yandex datalens.

27.05.2025    1090    13    uribur    6    

16

Интеграции Кейсы проектов Бесплатно (free)

На крупных проектах интеграции залогом успеха становится использование грамотных технических решений, инструментов и методик. Расскажем о совместном использовании «Конвертации данных 2» и 1С:Шины, подходах к интеграции НСИ, а также разделении труда в команде исполнителя.

10.04.2025    1517    0    Mick2iS    1    

13

Архитектура решений Программист Платформа 1С v8.3 Бесплатно (free)

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

14.10.2024    5436    0    comol    29    

31

Кейсы автоматизации Платформа 1С v8.3 1С:Документооборот Бесплатно (free)

Компания «Уралхим» использует 1С:Документооборот не только для хранения и согласования документов, но и для централизованного управления НСИ между 47 системами (не только на 1С); для бэкенда к мобильным приложениям охранников; и в качестве сервиса заказа справок для сотрудников. О деталях реализации нестандартных решений, разработанных в компании «Уралхим» на базе 1С:Документооборот, пойдет речь в статье.

02.08.2024    4460    0    Novattor    1    

18

Кейсы автоматизации Проектирование бизнес-процессов Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Бесплатно (free)

В данной публикации я дополню конкурсную публикацию комментариями, техническими и проектными подробностями. Должно быть ещё интересней.

11.07.2024    1628    0    Ingraf    4    

11

Кейсы автоматизации Платформа 1С v8.3 Энергетика и ЖКХ Россия Бесплатно (free)

Делимся опытом автоматизации учета башни раздачи воды.

27.12.2023    2693    0    slavik27    8    

15

Архитектура решений Программист Бесплатно (free)

Рассмотрим применение архитектурной проверки задач в процессе разработки.

30.10.2023    7027    0    ivanov660    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 179 10.09.13 11:06 Сейчас в теме
1 пункт, если в типовые модули делать минимум изменений то как елка код не будет выглядеть, а в доп модулях комментировать все не обязательно.
2 пункт да, видно надо было расширить в статье это.
3 пункт получается аналог внешнего модуля, просто изменения можно внедрять не залезая в конфигуратор. Такой вариант тоже имеет право на жизнь.
3. Поручик 4593 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 123 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. alexsiswx 12.09.13 11:39 Сейчас в теме
Правильно отмечено! "обновлять конфигурацию поставщика" - обязательно.
9. madmpro 43 16.01.14 15:11 Сейчас в теме
//--> I.F. Проведение будущей датой
Процедура ОбработчикИзмененияДаты(Данные)
    Если Данные="ДокументОбъект.Дата" ИЛИ Данные="" Тогда
        Если Дата>ТекущаяДата() Тогда
            ЭтаФорма.ИспользоватьРежимПроведения=ИспользованиеРежимаПроведения.НеОперативный;
        Иначе
            ЭтаФорма.ИспользоватьРежимПроведения=ИспользованиеРежимаПроведения.Оперативный;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры 
//<-- I.F. Проведение будущей датой
//...
////////////////////////////////////////////////////////////­////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
//...
//--> I.F. Проведение будущей датой
ПодключитьОбработчикИзмененияДанных("Дата","ОбработчикИзмененияДаты");
//<-- I.F. Проведение будущей датой






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