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

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

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

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

 

 

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Рефакторинг и качество кода Нейросети Программист 1С 8.3 Бесплатно (free)

Как за вечер проверить, годится ли локальная модель для поиска ошибок в вашем коде 1С, и не обмануть себя по дороге. Разбираю замер Qwen2.5-Coder 1.5B, 3B и 7B на коде с заранее известными дефектами: почему полноту и шум надо считать раздельно, как 3B набирает высокий балл, вообще не читая код, сколько минут уходит на боевую процедуру на процессоре и на GTX 1650, и чем кончилась попытка подложить модели справку по методам платформы.

16.09.2026    923    nedomolkov.ivan    4    

1

Инструментарий разработчика Нейросети Рефакторинг и качество кода Бизнес-аналитик Пользователь Руководитель проекта Бесплатно (free)

Железо перестало быть проблемой, и качество ответов немедленно встало в потолок. Дальше пошли три улучшения, каждое из которых выглядело очевидно правильным: свой справочник стандартов, код процедур в поисковом индексе и переписывание вопроса отдельной моделью. Первое работало, но стоило пятнадцать тысяч токенов в каждом запросе. Второе уронило находимость на двадцать процентов. Третье уронило качество с 0,864 до 0,782 и растянуло прогон с 88 секунд до 302. Рассказываю, чем я это померил, почему на глаз ни одно ухудшение не видно и почему добавление правдивой информации регулярно делает поиск хуже.

14.09.2026    497    solbol    0    

3

Рефакторинг и качество кода Нейросети Программист 1С:Предприятие 8 Бесплатно (free)

Продолжение статьи «BSL Language Server внутри 1С:EDT: коннектор, которого не хватало». Там мы научили EDT видеть расширенную диагностику BSLLS, а здесь замкнем контур: научим ИИ-агентов автоматически исправлять эти ошибки строго по официальным стандартам разработки 1С.

02.09.2026    1701    malikov_pro    2    

6

Инструментарий разработчика Нейросети Рефакторинг и качество кода Программист 1С 8.3 Абонемент ($m)

Вам досталась чужая обработка на полторы тысячи строк. Автор уволился, документации нет, а править её завтра. Обработка читает код за вас: что он делает, что в нём не так и с чего начинать. Всё считается локально, в интернет ничего не уходит.

10 стартмани

01.09.2026    760    1    nedomolkov.ivan    5    

1

Рефакторинг и качество кода Нейросети Программист 1С:Предприятие 8 Бесплатно (free)

Рассказываю, как подключить к языковым моделям (в Cursor, VS Code, Claude Code) настоящий Синтакс-помощник 1С - со всеми типами, методами, параметрами, примерами кода, контекстами вызова и версиями платформы. Без ручного парсинга HTML: плагин для 1C:EDT в один клик выгружает официальную справку в Docker-контейнер с MCP-сервером и гибридным поиском (FTS5 + векторный индекс).

01.09.2026    1576    malikov_pro    6    

4

Рефакторинг и качество кода Программист 1С:Предприятие 8 Бесплатно (free)

Если вы разрабатываете в 1C:EDT, то наверняка знакомы со штатной системой статического анализа через плагин 1C:Code style V8. Но вы также могли заметить, что база встроенных правил давно не обновлялась: последний стабильный релиз плагина вышел ещё в декабре 2023 года. Чтобы вернуть в EDT свежие и актуальные проверки, я форкнул и доработал проект коннектора к BSL Language Server. В этой статье расскажу, как устроена интеграция, зачем она нужна в эпоху LLM и как подключить плагин за пять минут.

01.09.2026    1207    malikov_pro    6    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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. Поручик 4611 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. Патриот 471 25.04.14 13:42 Сейчас в теме
Сакральные знания)) хотя для новичков может и полезно
Для отправки сообщения требуется регистрация/авторизация