Использование Стека вызовов в качестве условия оператора Если [...] Тогда

Публикация № 1263068

Разработка - Практика программирования

Делюсь интересным приёмом, позволяющим использовать данные стека исполнения кода 1С в качестве условия, накладываемого на выполнение кода.
 
 Рис.1 Пример визуализации стека в отладчике (но здесь не про отладчик будет идти речь)

Немного теории Стек вызовов - это инструмент, который показывает последовательность процедур и функций, исполнение которых привело к той строке модуля, что отлаживается сейчас. Стек большинство разработчиков используют при отладке исполнения кода. Также многие заметили, что начиная с платформы 8.3.15 в Журнал регистрации базы 1С и в операторе "Попытка ... Исключение ... КонецПопытки" возможно увидеть полный стек вызовов всех процедур, а не только вызов последней строки как было раньше (и this is хорошо).

Для начала расскажу как первый раз применил получение и разбор стека исполнения самим кодом 1С. В конец дам общий принцип по применению на практике.

Возникла проблема: При закрытии месяца в 1С: ERP, при выполнении операции "Формирование записей книг покупок и продаж" произошла ошибка: Операцию не удалось выполнить по причине того, что Отражение документов в регл учете невозможно поместить в запрещенный период. Дате 01.06.2019 соответствует запрет изменения данных для пользователя "Администратор (Михаил)" по 31.05.2020 (установлена общая дата запрета) 

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

Приступив к решению задачи:

  • Отыскал исходную ошибку по Журналу регистрации 1С
 
 Рис.2 Ошибка в Журнале регистрации
 
 Текст ошибки со стеком вызова

При выполнении операции "Формирование записей книг покупок и продаж" произошла ошибка:
Не удалось выполнить по причине Отражение документов в регл учете невозможно поместить в запрещенный период.

Дате 01.06.2019 соответствует запрет изменения данных для пользователя "ГлавныйБухгалтерЗаместитель" по 29.02.2020 (установлена общая дата запрета)
{ОбщийМодуль.РеглУчетПроведениеСервер.Модуль(3509)}:        ВызватьИсключение ОписаниеОшибки;
{ОбщийМодуль.РеглУчетПроведениеСервер.Модуль(733)}:    ПроверитьДатуЗапретаДляОтраженияДокументовВРеглУчете(ШаблонЗапретаДанных);
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(9191)}:    РеглУчетПроведениеСервер.ВернутьДокументыКОтражению(ПараметрыРасчета.МенеджерВременныхТаблиц);
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(1602)}:    ВернутьДокументыКОтражениюВУчете(ПараметрыРасчета);
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(1588)}:    ВыполнитьРасчет(ПараметрыРасчета);
{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(1506)}:            ВыполнитьРасчетСЗамеромВремени(ПараметрыРасчета);
{ОбщийМодуль.УчетНДСУП.Модуль(7742)}:    УчетНДСУПСлужебный.СформироватьЗаписиКнигиПокупокПродаж(КонецПериода, МассивОрганизаций, МассивСчетовФактур);
{ОбщийМодуль.ЗакрытиеМесяцаСервер.Модуль(13608)}:    УчетНДСУП.ВыполнитьЗаданияПоФормированиюКнигиПокупокПродаж(
{(1)}:ЗакрытиеМесяцаСервер.Выполнить_ФормированиеЗаписейКнигПокупокИПродаж(Параметры[0])
{ОбщийМодуль.ОбщегоНазначения.Модуль(4856)}:    Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
{Обработка.ОперацииЗакрытияМесяца.МодульМенеджера(1558)}:                ОбщегоНазначения.ВыполнитьМетодКонфигурации(
{(1)}:Обработки.ОперацииЗакрытияМесяца.ВыполнитьРасчетЭтапов(Параметры[0])
{ОбщийМодуль.ОбщегоНазначения.Модуль(4856)}:    Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";

{ОбщийМодуль.УчетНДСУПСлужебный.Модуль(1526)}:            ВызватьИсключение ТекстСообщения;
{ОбщийМодуль.УчетНДСУП.Модуль(7742)}:    УчетНДСУПСлужебный.СформироватьЗаписиКнигиПокупокПродаж(КонецПериода, МассивОрганизаций, МассивСчетовФактур);
{ОбщийМодуль.ЗакрытиеМесяцаСервер.Модуль(13608)}:    УчетНДСУП.ВыполнитьЗаданияПоФормированиюКнигиПокупокПродаж(
{(1)}:ЗакрытиеМесяцаСервер.Выполнить_ФормированиеЗаписейКнигПокупокИПродаж(Параметры[0])
{ОбщийМодуль.ОбщегоНазначения.Модуль(4856)}:    Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
{Обработка.ОперацииЗакрытияМесяца.МодульМенеджера(1558)}:                ОбщегоНазначения.ВыполнитьМетодКонфигурации(
{(1)}:Обработки.ОперацииЗакрытияМесяца.ВыполнитьРасчетЭтапов(Параметры[0])
{ОбщийМодуль.ОбщегоНазначения.Модуль(4856)}:    Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";

Открыл в конфигураторе ОбщийМодуль.РеглУчетПроведениеСервер строку № 3509 с текстом ВызватьИсключение ОписаниеОшибки;

Процедура ПроверитьДатуЗапретаДляОтраженияДокументовВРеглУчете(ШаблонЗапретаДанных, НаборЗаписей = Неопределено, ОтражаемыйДокумент = Неопределено)
	
	Если НаборЗаписей = Неопределено Тогда
		Отбор = Новый Структура;
		НаборЗаписей = Новый Структура("Регистр, Отбор", "РегистрСведений.ОтражениеДокументовВРеглУчете", Отбор);
	Иначе
		НаборЗаписей.ДополнительныеСвойства.Вставить("ПроверкаДатыЗапретаИзменения", Ложь);
	КонецЕсли;
	
	ОписаниеДанных = Новый Структура("НоваяВерсия, Данные", Истина, НаборЗаписей);
	ОписаниеОшибки = "";
	Если ДатыЗапретаИзменения.НайденЗапретИзмененияДанных(ШаблонЗапретаДанных, ОписаниеДанных, ОписаниеОшибки) Тогда
	
		ЗаписьЖурналаРегистрации(
			НСтр("ru = 'Установка нового статуса отражения в учете';
				|en = 'Set new status of recording in accounting'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,
			?(ОтражаемыйДокумент = Неопределено, ОтражаемыйДокумент, ОтражаемыйДокумент.Метаданные()),
			?(ОтражаемыйДокумент = Неопределено, ОтражаемыйДокумент, ОтражаемыйДокумент),
			ОписаниеОшибки);
		
		ВызватьИсключение ОписаниеОшибки;
		
	КонецЕсли;
	
КонецПроцедуры

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

  • В поисках решения сразу пришли мысли: протянуть из обработки закрытия какой-нибудь параметр функции или сделать некий глобальный признак. Стал смотреть стек вызовов всех процедур (см. выше блок "Текст ошибки со стеком вызова")

читаю в нём:

....

ЗакрытиеМесяцаСервер.Выполнить_ФормированиеЗаписейКнигПокупокИПродаж(Параметры[0])

...

Обработки.ОперацииЗакрытияМесяца.ВыполнитьРасчетЭтапов

....

и тут загорается лампочка!

Можно ведь по тексту стека вызовов понять, что вызов идёт из закрытия месяца!

  • Нашёл, как получить стек вызовов в коде. Строку с данными стека вызовов можно получить только следующей комбинацией ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()). Причем отдельно в ИнформацияОбОшибке() данных о стеке не содержится, она загадочным образом достается только функцией ПодробноеПредставлениеОшибки().
Попытка

      ВызватьИсключение "Любой текст";

Исключение
		
      ПолныйТекстОшибкиВключаяСтекВызовов = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
КонецПопытки;
  • Далее создал расширение конфигурации, в которое перетащил процедуру &Вместо("ПроверитьДатуЗапретаДляОтраженияДокументовВРеглУчете") из ОбщийМодуль.РеглУчетПроведениеСервер. Описал условие Если [...] Тогда, где поиском выражений-маркеров в полном тексте ошибки понимаю, что идёт вызов этапа формирования книг из обработки закрытия месяца и не применяю контроль даты запрета.
 
 Код из расширения

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

 

Какой могу сделать вывод в заключение:

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

 

Попытка

   ВызватьИсключение "Любой текст";
			
Исключение
		
   ПолныйТекстОшибкиВключаяСтекВызовов = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
   Если Найти(ПолныйТекстОшибкиВключаяСтекВызовов, "Выражение-маркер 1") > 0
        И ... 
	И Найти(ПолныйТекстОшибкиВключаяСтекВызовов, "Выражение-маркер N") > 0 Тогда
	
       //Исполняемый код 1

   Иначе

       //Исполняемый код 2

   КонецЕсли;

КонецПопытки;

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

Основная мысль заложенная в данную публикацию это ИДЕЯ как вытащить дерево стека в сам исполняемый код, идея которую можно положить себе в ячейку памяти. Возможно она пригодиться!

На практике такой приём позволяет зашить часть возможностей отладки в СВОЙ КОД 1С, чтобы он получал и анализировал дерево стека и направлял алгоритм в разные ветки, в зависимости от наличия в тексте стека вызова определенных процедур (выражений-маркеров).

 

 
 Другие публикации автора

Ссылка на компетенции по 1С:ERP - команда со знаниями, умениями и успешными проектами.

Специальные предложения

Лучшие комментарии
3. tormozit 5919 13.07.20 07:34 Сейчас в теме
Опасный прием. Но в плане быстрой и компактной модификации кода поставщика действительно может быть оправдано. Если уж применять, то надо
1. Обязательно проверять минимальную версию платформы
2. На большой глубине стека избегать применения в частотном коде, т.к. затраты на сборку полной строки стека могут стать заметными.
GreenDragon; bulpi; Quasar; Dach; awk; Plotks2017; triviumfan; lmnlmn; dmryzhkov; sapervodichka; +10 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. oleganatolievich 146 13.07.20 00:27 Сейчас в теме
Простите, но, по-моему, это жуткий костыль.
Monte Carlo; GreenDragon; dabu-dabu; zqzq; webester; Brawler; vladimirmatancev; Dach; Quasar; IgorS; Yashazz; denmax; Артано; maksa2005; BaphoBush; +15 3 Ответить
2. tindir 13.07.20 05:57 Сейчас в теме
И мне так кажется, что это костылина, с первого взгляда. Выгладит как граница с вороватым таможенником - "эээээ, братъ, прхди, дорогой! А ты стой тут, ты пришел не с нашего района".
Интересен диаметр глаз кодера, который потом наткнется на этот код, когда будет разбирать ситуацию с тем что "восстановление последовательности зафигачило" закрытие пятилетней давности.

Стек вызово это ИМХО аналитический инструмент.
6. sapervodichka 3593 13.07.20 09:44 Сейчас в теме
(2) Вадим, привет, а со второго взгляда - тут прежде всего идея, о том как подтянуть дополнительные аналитики из стека исполнения кода. Не многие знают, что можно получить путь всех вызовов и использовать для анализа в самом коде. Например, есть задача починить в течение пары часов до обеда, а после обеда уже пользователи сдают результат руководству, или выплачивают зарплату в банк. Тут никто не думает о костыльности, а думает как сделать здесь и сейчас, и дополнительное знание такого варианта окажется возможной палочкой выручалочкой.
Upiterus; dmryzhkov; mikl79; SergeRSA; leonidy4; sasha777666; VKislitsin; +7 1 Ответить
10. Yashazz 3325 13.07.20 10:44 Сейчас в теме
(6) Вот именно из "починить за пару часов до обеда" и "ну всё ж работает, результат есть" и рождаются самые жуткие, самые опасные и самые впоследствии тяжело исправляемые костыли. Сам подход опасен.

Не расширения воротить надо по каждому поводу, а просто внимательно и вдумчиво отлаживаться.
13. sapervodichka 3593 13.07.20 12:10 Сейчас в теме
(10) Яков, я вот уверен, что половина даже не въехала в суть. Увидели знакомые слова Попытка Исключение и давай костылями махать. Яж не дурака тут пишу. НЕ В ОТЛАДКЕ ДЕЛО! Дело в возможности затащить стек исполнения в программируемый алгоритм.
21. Yashazz 3325 13.07.20 17:02 Сейчас в теме
(13) Я-то понял. Я именно про подход и что половина не въедет, а костылями махать начнёт. Возможность хитренькая и скользкая, с весьма узкими рамками применения, и при поверхностном чтении производит опасно-обманчивое впечатление.
Никогда ваши публикации не считал "дурака пишу", наоборот, они дельные, толковые и грамотные. Но конкретна эта - провокационна.
sapervodichka; +1 Ответить
24. sapervodichka 3593 13.07.20 17:17 Сейчас в теме
(21) как brr ниже написал, что будет совсем хорошо когда 1С вставит получение стека исполнения без вызова исключения
19. tindir 13.07.20 13:58 Сейчас в теме
(6)
окажется возможной палочкой выручалочкой

Извните, но это будет палочкой нафигвселомалочкой через полгода, когда все "срочные" отчеты уже сданы и забыты. А вот сейчас надо опять что-то сдать/заплатить.
Не надо апеллировать тем что это "временное" решенение, мы все знакомы с законом синей изоленты ;)
Артано; +1 Ответить
20. sapervodichka 3593 13.07.20 14:07 Сейчас в теме
(19) Вадим, ты забей, пожалуйста про исправление ошибки, ну вот не важно оно тут. Важен принцип, что можно текст ошибки со стеком получить и проанализировать самим же кодом.
Fox-trot; +1 Ответить
5. sapervodichka 3593 13.07.20 09:09 Сейчас в теме
(1) костыль это если в руках инвалида, а если в руках норм разраба, то это, конечно, не затычка для каждой дырки, а инструмент, который по делу, где нужно можно грамотно задействовать (лишь бы принцип был известен! а принцип я тут изложил, а в других публикациях я такой техники не встречал, так что ноги можно в другом месте о коврик обтирать, а тут подчерпнуть знаний)
bulpi; leonidy4; Perfolenta; samir_27@list.ru; dmryzhkov; +5 Ответить
8. oleganatolievich 146 13.07.20 09:49 Сейчас в теме
(5) как много лишних эмоций. хорошо, разверну ответ: допустим модуль A вызывает модуль B, а он в свою очередь модуль C. так вот в модуле C падает exception, и анализатор ошибки ищет модуль A в стеке вызовов. И внезапно модуль A переименовали, логика поменялась, а разраб, даже опытный забыл про этот костыль. В итоге система ломается, так как не соблюдается принцип инкапсуляции кода, насколько он возможен в 1C
Monte Carlo; Рамзес; +2 Ответить
9. sapervodichka 3593 13.07.20 09:55 Сейчас в теме
(8) ты всё правильно пишешь, как и многие другие доработки, эта может перестать работать (это жизнь от обновления к обновлению). Но посыл данной статьи другой, о возможности применить данные стека вызова в условиях в коде (она есть).
Рамзес; +1 Ответить
3. tormozit 5919 13.07.20 07:34 Сейчас в теме
Опасный прием. Но в плане быстрой и компактной модификации кода поставщика действительно может быть оправдано. Если уж применять, то надо
1. Обязательно проверять минимальную версию платформы
2. На большой глубине стека избегать применения в частотном коде, т.к. затраты на сборку полной строки стека могут стать заметными.
GreenDragon; bulpi; Quasar; Dach; awk; Plotks2017; triviumfan; lmnlmn; dmryzhkov; sapervodichka; +10 Ответить
31. Brawler 470 14.07.20 12:11 Сейчас в теме
(3) А завтра 1С по другому данные стека будет показывать и все, приехали))
32. sapervodichka 3593 14.07.20 12:18 Сейчас в теме
(31) интересная позиция, тогда по твоей логике любой код завтра работать не будет, согласен? (1С постоянно всё меняет, а мы допиливаем и получаем зарплату)
33. sapervodichka 3593 14.07.20 12:25 Сейчас в теме
(32) я с позиции специфики нашей работы (тут код стабилен как и любая другая доработка... до очередного обновления релиза), доработка тут нормальная, не говнокод написанный из корыстных целей, а затем его поддержки. Не "а ля снимаем колеса и он наш"
34. Brawler 470 14.07.20 12:54 Сейчас в теме
(32)
1. как выше писали это костыли и притом неявные, другой разработчик не будет подозревать, что система так себя может вести
2. нельзя надеяться на то что и завтра "ЗакрытиеМесяцаСервер.Выполнить_ФормированиеЗаписейКнигПокупокИПродаж" будет так же называться
3. нельзя надеяться на то что формируемая строка в ПодробноеПредставлениеОшибки будет такого же формата, да и к тому же думаю она там малость и на разных языках может формироваться

я в своей практике стараюсь не опираться на жиденькие конструкции

а в последнее время блин превратился в бесплатного дебаггера ERP... писец качество продукта под номером 2.4.12.75 ... пока пытаешься воспроизвести одну ошибку, по пути еще пару находишь

Вот сегодня новая встретилась в заказе клиента, Онлайн взаиморасчеты...

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Отражение документов в регл учете)
{ОбщийМодуль.ПроведениеСерверУТ.Модуль(433)}: Объект.Движения.Записать();
{Документ.ЗаказКлиента.МодульОбъекта(868)}: ПроведениеСерверУТ.ЗаписатьНаборыЗаписей(ЭтотОбъект);

по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Отражение документов в регл учете)
{ОбщийМодуль.РеглУчетПроведениеСервер.Модуль(912)}: НаборЗаписей.Записать();
{ОбщийМодуль.РеглУчетПроведениеСервер.Модуль(1855)}: ВернутьДокументыКОтражению(МенеджерВременныхТаблиц);
{ОбщийМодуль.ОперативныеВзаиморасчетыСервер.Модуль(1259)}: РеглУчетПроведениеСервер.ЗарегистрироватьДокументыРасчетовСПартнерамиКОтражениюВРеглУ­чете(ТаблицаИзменений);
{ОбщийМодуль.ОперативныеВзаиморасчетыСервер.Модуль(1482)}: ЗаполнитьОперативныеВзаиморасчеты(ОсновныеПараметры);
{РегистрНакопления.РасчетыСКлиентами.МодульНабораЗаписей(631)}: ОперативныеВзаиморасчетыСервер.РассчитатьПоИзменениям(Запрос.МенеджерВременныхТаблиц, Истина, Отбор.Регистратор.Значение, ДополнительныеСвойства);
{ОбщийМодуль.ПроведениеСерверУТ.Модуль(433)}: Объект.Движения.Записать();
{Документ.ЗаказКлиента.МодульОбъекта(868)}: ПроведениеСерверУТ.ЗаписатьНаборыЗаписей(ЭтотОбъект);

по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Отражение документов в регл учете)
Показать
36. sapervodichka 3593 14.07.20 13:52 Сейчас в теме
(34) Я тут не писькой меряюсь, а пишу О ВОЗМОЖНОСТИ ОНЛАЙН ПОЛУЧАТЬ КОДОМ СТЭК ВЫЗОВОВ И КОДОМ ЖЕ ОНЛАЙН АНАЛИЗИРОВАТЬ. Повторю, что костыли у инвалидов (если "другой разработчик не будет подозревать, что система так себя может вести", значит он не умеет читать код и он не разработчик, а инвалид). И согласен с тобой, что "нельзя надеятся на завтра" т.к. большая часть твоего кода из ERP 2.4 не будет в ERP 2.5 работать.
37. sapervodichka 3593 14.07.20 13:59 Сейчас в теме
(36) те кто пишет, что это костыль, просто почитали и не поняли. Почитай комменты 98% альтернативного решения определить на лету место вызова в коде не могут предложить, только со стула могут пЁрнуть
35. tormozit 5919 14.07.20 13:24 Сейчас в теме
(31) Ну про то, что нужно сделать опознание формата вывода стека, я думал итак понятно хорошему программисту. При изменении формата нужно выбрасывать исключение. К тому же этот формат меняться не будет с большой вероятностью навсегда (в пользу этого говорит история платформы 1С). Из-за очень низкой вероятности этого изменения, этим уже можно и пренебречь в частных случаях, для которых предлагается этот прием.
sapervodichka; +1 Ответить
40. Артано 671 20.07.20 07:37 Сейчас в теме
(3) Не согласен. Объем усилий по ограждению этого фрагмента сигнальными флажками типа "Осторожно мины" сопоставим с конвенционными методами исправления. Такой подход может иметь место максимум для понимания где именно причина проблемы, то есть как часть отладки в процессе разработки.
Выпускать в релиз такое решение без соответствующей изоляции и документирования чреват более серьезными проблемами, особенно в условиях коллективной разработки.
4. Алексей Воробьев 85 13.07.20 08:32 Сейчас в теме
Вполне годно для ограниченного применения - в рамках конкретной задачи в конкретной организации.
Масштабировать такие решения, наверное, будет не совсем правильно. А, в связи с этим, и проверять минимальную версию платформы не обязательно - вероятность отката платформы для продуктовых баз невелика...
Fox-trot; bulpi; dmryzhkov; sapervodichka; +4 Ответить
7. Darklight 22 13.07.20 09:46 Сейчас в теме
Присоединяюсь к вышесказанному. В данном случае - почти годно. Надо только понимать - что обработка исключений - дело затратное по-производительности - и всюду вставлять вставки как на первом скриншоте (т.е. специально генерируя исключение, чтобы получить стек вызова) - может дать сильное проседание производительности - так что это скорее уж очень специальный приём - не для всех! Другое дело - когда (как далее по тексту) исключение и так уже создаётся - тогда да - данный финт можно применить.

Но.... надо понимать, что 1С постоянно тусует код типовых конфигураций - от чего названия модулей и процедур может меняться (полный путь) - а тут как раз идёт его анализ. Это не есть хорошо! Поэтому - тут тогда лучше делать всегда конкретные условия на ветки ветвления - без секции "Иначе" - вернее с ней - в неё должна быть генерация исключения - что ветка условия Вышла за границы условия и программисту нужно его пересмотреть!

Ну а я, всё-таки за то, чтобы передавать доп параметры через внешние переменные (обычно - параметры сеанса для управляемых приложений). Это куда надёжнее - заводишь такую переменную (параметр сеанса) типа "Соответствие"("ФиксированноеСоотвествие"), парой общих функций помещаешь и извлекаешь оттуда доп параметры для конкретной вложенной функции (по её имени, аргументу, и, возможно, дополнительной текстовой пометке-ограничению).

А вообще - для решения таких задач есть АОП - жаль в 1С его нет (хотя сами расширения - вообще-то это уже АОП - вот только очень ограниченный) - не хватает в 1С продвинутого АОП, очень не хватает...

Ну а данной статье очень не хватает приложения како-нибудь функции алгоритма - для продвинутого и чёткого разбора текста стека - а то как-то использовать функцию "Найти" по месту вызова - совсем не кошерно!
sapervodichka; +1 Ответить
11. Yashazz 3325 13.07.20 10:45 Сейчас в теме
Я для таких вещей написал конфигурацию анализа конфигураций и копаюсь через неё, как возникают подобные проблемы. Обычную трассировку скинул, разобрал, и всё. Элементарные выгрузки замера производительности в таб.документ никто не отменял, а там пошагово всё замечательно видно.
12. sapervodichka 3593 13.07.20 10:59 Сейчас в теме
(11) Яков, привет, точно дочитал? Представим конфигуратор закрыт, как сам кусок кода 1С исполняемый в некой процедуре получает у тебя Стек вызовов и определяет сам по условию Если Найти(ТекстСтека, "Выражение-маркер") > 0 Тогда какой блок текущей процедуры ему выполнять дальше.
22. Yashazz 3325 13.07.20 17:04 Сейчас в теме
(12) Дочитал, дочитал) Я одно время такую штуку пользовал - она выгружала код конфы в файлы, дописывала в нужные файлы примерно такое же, грузила обратно.
sapervodichka; +1 Ответить
23. sapervodichka 3593 13.07.20 17:15 Сейчас в теме
25. Yashazz 3325 13.07.20 19:47 Сейчас в теме
(23) Надеюсь, однажды мне разрешат её выложить на ИС, хотя бы урезанную. Тогда можно я твою идею в ней воплощу?
26. sapervodichka 3593 13.07.20 19:57 Сейчас в теме
(25) конечно =))) только помни, что когда твой ПО заработает пару млн $ я на тебя предъяву кину на компенсацию авторства )))
27. Yashazz 3325 13.07.20 22:33 Сейчас в теме
(26) Я сам первый тебе маякну. Хотя это всё чистейшая фантастика... Тут даже моя обработка, раскладывающая код на блок-схемы по ходу выполнения, и то набрала в своё время 4 плюса (юзал граф.схемы 1С, строил с анализом текста). Какие уж тут миллионы)))
sapervodichka; +1 Ответить
14. zhuntovda 13.07.20 13:20 Сейчас в теме
Хитро, но я бы не стал. Явный костыль. На заметку можно взять, но пользовать в крайнем случае, от слова никогда!
15. sapervodichka 3593 13.07.20 13:25 Сейчас в теме
(14) =))) пойду солью сертификат эксперта в унитаз. Критика-то должна быть обоснована. Предложи альтернативный способ как ты выяснишь в коде место стартового вызова для общего метода с большой вложенностью?
16. sapervodichka 3593 13.07.20 13:28 Сейчас в теме
(15) =))) наверняка также на лету будешь получать и разбирать путь из стека в коде
17. brr 179 13.07.20 13:33 Сейчас в теме
А потом у нас "В данной транзакции происходили ошибки", опасная штука предложена. 1С стоило бы добавить получение стека вызовов без таких костылей. А так идея - огонь.
zqzq; Yashazz; sapervodichka; +3 Ответить
18. sapervodichka 3593 13.07.20 13:36 Сейчас в теме
(17) да, это отличная идея, было бы круто с их стороны!
41. sapervodichka 3593 08.08.20 11:48 Сейчас в теме
(18) "В данной транзакции происходили ошибки" хороший контраргумент ))) но он не из этой оперы, точно не для описанного в публикации случая (там он просто невозможен!). И такая бяка всплывает обычно только для записи в попытке внутри уже открытых транзакций. При том значительная часть кода конфигураций выполняет вне транзакции, т.е. высказанное замечание на принцип не сильно влияет т.к. не идет отработки записи в попытке. Короче не так страшен черт как его малюют.
28. Aquashop 44 13.07.20 22:53 Сейчас в теме
Пример конечно интересный, но можно же было через замер производительности при старте закрытия увидеть весь выполняемый код и понять в чём проблема, разве нет?
29. sapervodichka 3593 13.07.20 23:06 Сейчас в теме
(28) как трассировать при закрытом конфигураторе?.. мысль тут не в разовой трассировке в отладчике и анализе кода, а в получение каждый раз онлайн кодом данных трассировки, и тем же самым кодом анализ этих данных и выбор дальнейших действий. Невозможно иначе в глубоко зарытой в модулях некой общей процедуре, вызываемой из десятков мест и имеющей кучу других предварительных вызовов иначе понять, откуда из интерфейса она вызвана.
Aquashop; +1 Ответить
30. Aquashop 44 13.07.20 23:31 Сейчас в теме
(29)Скорее всего не всё, но большая часть дошло))) Интересный вариант, надо попробовать потестить, должно существенно ускорить поиск по сравнению с замером. А вот выбор дальнейших действий по трассировке опасно но порой необходимо... Благодарю
sapervodichka; +1 Ответить
38. утюгчеловек 21 15.07.20 12:41 Сейчас в теме
39. sapervodichka 3593 15.07.20 12:53 Сейчас в теме
Оставьте свое сообщение

См. также

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    36808    unichkin    46    

Памятка работ по проекту 1С

Управление проектом 1С:Франчайзи, автоматизация бизнеса Абонемент ($m)

Схема работ по проекту внедрения 1С освежает в голове и визуализирует общую картину мероприятий. Будет полезно как для Заказчика так и для Исполнителя при подготовке проекта и проведении совещаний по ходу проекта.

1 стартмани

23.07.2020    7158    sapervodichka    13    

Уведомление пользователей об изменениях в объектах (расширение)

Практика программирования v8 ERP2 КА2 Абонемент ($m)

Позволяет без доработок настроить уведомления пользователям об изменениях объектов и их реквизитов. Уведомления отправляются в виде задач по проверке объектов с ссылками на объекты.

2 стартмани

06.07.2020    3140    7    sapervodichka    9    

Подсистема прав доступа к объектам с гибкими отборами (расширение)

Роли и права v8 ERP2 БП3.0 УТ11 КА2 ЗУП3.x Абонемент ($m)

Возможность без доработок конкретизировать пользователям права Просмотра и Изменения объектов базы 1С, установив ограничения с помощью отборов системы компоновки данных.

2 стартмани

02.07.2020    5657    41    sapervodichka    25    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    29327    tormozit    100    

Памятка работ по задаче 1С

Техническое задание Управление проектом v8 1cv8.cf Абонемент ($m)

Памятка выполняемых работ по решению длительных задач по 1С.

1 стартмани

25.06.2020    8708    sapervodichka    0    

Применение программистом таблицы рисков для оценки технического задания

Техническое задание Бесплатно (free)

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

28.05.2020    7863    sapervodichka    70    

Добрый великан

Управление проектом Бесплатно (free)

Руководители проектов определяют наше настоящее, каким оно будет?! Ответ прост - таким, каким и сам РП.

25.05.2020    5089    sapervodichka    1    

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

Пароли v8 v8::Права 1cv8.cf Абонемент ($m)

Предназначается для запуска сеанса другого пользователя из своего сеанса 1С (если пароль вам неизвестен).

1 стартмани

02.07.2019    18592    183    sapervodichka    0    

Настройка ограничений входа пользователей в базу (расширение)

Роли и права v8 v8::Права 1cv8.cf Абонемент ($m)

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

2 стартмани

19.05.2020    6011    6    sapervodichka    10    

БП 3.0, Закрытие месяца, Отключение проверок операций прошлых периодов

Закрытие периода v8 v8::БУ БП3.0 БУ Абонемент ($m)

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

1 стартмани

13.05.2020    4285    10    sapervodichka    9    

Проводим по БУ "на лету"

Бухгалтерский учет v8 ERP2 КА2 БУ НУ Бесплатно (free)

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

01.05.2020    4347    sapervodichka    1    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

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

20.09.2012    77207    tormozit    131    

Панель #Расширение объекта: Редактор, Права, Поиск, Сторно, Обмен

Универсальные обработки v8 1cv8.cf Абонемент ($m)

Панель команд текущего объекта (документа, справочника и т.д.) со следующим возможностями: Редактор реквизитов, таблиц и движений текущего объекта, Анализ прав доступа к текущему объекту, Поиск ссылок на объект с отборами, Сторно движений документа, Выгрузка/загрузка текущего объекта между базами. Реализована всплывающей панелью в форме объекта. Подключается как расширение конфигурации (*.cfe) либо отдельными обработками.

1 стартмани

01.05.2020    6505    67    sapervodichka    1    

Переход с партионного режима и производства 2.1 на режимы 2.2 в 1С:ERP Управление предприятием

Производство готовой продукции (работ, услуг) v8 ERP2 Россия УУ Бесплатно (free)

В данной статье мы расскажем о практическом опыте ВЦ «Раздолье» в переводе работы клиентов в «1С:ERP Управление предприятием» на новые режимы: использование производства 2.2 и партионный учет версии 2.2 (далее режимы 2.2).

27.04.2020    4154    1СERP    4    

Поиск пересекающихся ссылок на комбинации объектов с ограничением области поиска по метаданным

Поиск данных v8 1cv8.cf Абонемент ($m)

Обработка ищет все объекты базы, в которых одновременно присутствуют перечисленные элементы. Построена на базе типовой обработки Все функции - Стандартные - Поиск ссылок на объект, но позволяет накладывать отбор не по одному объекту, а по нескольким, что позволяет настраивать поиск по комбинациям условий. И ограничивать область поиска.

1 стартмани

12.03.2020    4760    11    sapervodichka    18    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    47506    tormozit    40    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

27.01.2020    22102    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    20608    John_d    22    

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

Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.01.2020    15914    sapervodichka    41    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    43836    tormozit    74    

Права на объект (расширение, отчет)

Роли и права v8 v8::Права 1cv8.cf Абонемент ($m)

Если пользователю не хватает прав на объект, то на практике в 90 % случаев, недостающую роль можно найти через типовой регистр сведений Права ролей. Также с помощью дополнительного отчета или небольшого расширения можно ускорить описанный процесс.

1 стартмани

07.01.2020    16691    sapervodichka    21    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    15393    kuzyara    33    

На время отключаем контроль остатков и проверку документов

Администрирование СУБД v8 ERP2 УТ11 КА2 Абонемент ($m)

На время сеанса отключаем контроль остатков и проверку документов в ERP, КА, УТ типовыми средствами и простым расширением.

1 стартмани

24.12.2019    7799    sapervodichka    2    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

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

25.04.2019    15850    m-rv    2    

Тест серверного оборудования на допустимое количество пользователей: как это использовать?

Администрирование СУБД Нагрузочное тестирование Сервера v8 1cv8.cf Абонемент ($m)

Выполнил 3 разных теста для проверки серверного оборудования (тест 1С, тесты gilev) на возможное число 1С онлайн-пользователей одновременно работающих на нем и интерпретировал результаты тестов через легких, средних и тяжелых пользователей с помощью таблицы с профилями реальных пользователей.

3 стартмани

17.12.2019    10611    sapervodichka    3    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    7883    Sibars    19    

Должно быть NULL в регистре бухгалтерии Хозрасчетный

Тестирование и исправление Инструментарий разработчика v8 v8::БУ 1cv8.cf БУ Абонемент ($m)

Обработка проверяет наличие и решает проблему с ошибкой развернутого сальдо в Оборотно-сальдовой ведомости (регистр бухгалтерии Хозрасчетный) из-за ошибки Универсального редактора реквизитов или кода программиста, устанавливающего пустые ссылки в значениях Валюты, Подразделения, Направления деятельности не равными NULL. И пересчёт итогов тут точно не поможет...

2 стартмани

21.10.2019    10394    25    sapervodichka    33    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    19869    m-rv    17    

Монитор показателей и лицензий с графиками

Администрирование СУБД v8 1cv8.cf Абонемент ($m)

Онлайн диаграмма лицензий 1С и показателей сервера 1С в различных измерениях и отборах.

1 стартмани

07.10.2019    12654    137    sapervodichka    17    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    30273    Yashazz    50    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    43782    rpgshnik    63    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    29981    m-rv    21    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    45384    ids79    54    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    26188    YPermitin    24    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    24846    YPermitin    80    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    27995    itriot11    34    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    30088    ids79    16    

Дополнение к контролю остатков

Учет ТМЦ Учет ТМЦ v8 ERP2 УТ11 КА2 БУ УУ Бесплатно (free)

Огорчает один момент в типовых решениях, когда проводится документ, ругаясь на нехватку остатков, система не сообщает, по какому именно регистру проблема. Дополнив сообщения контроля названием регистра, можно уменьшить время расследования проблемы (исключив из процесса необходимость запуска программистом отладки в конфигураторе для выявления имени проблемного регистра).

15.08.2019    15437    sapervodichka    15    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    72228    ids79    49    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    75491    Serginio    108    

Новости для пользователей

Пользователю системы v8 1cv8.cf Бесплатно (free)

Для уведомления пользователей программных продуктов 1С о разных событиях, в них включена подсистема «Новостной центр». Это довольно удобная штука, т.к. новостные ленты сообщают о выходе обновлений, о новостях и событиях в сфере учёта. Но можно увеличить пользу от новостной подсистемы используя её локально в рамках 1С базы. Например, внутренняя служба техподдержки или внедряющая компания может через новостную ленту оповещать пользователей информационной базы об изменениях в программе, совещаниях, проведении тестирований, заполнения нужных документов или сдача отчетов к определенной дате и т.п.

05.08.2019    13108    sapervodichka    18    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    31610    avalakh    22    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    53360    ids79    11    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    33703    ids79    40    

Структура подчиненности с хронологией документов и кнопками проведения и удаления

Обработка документов v8 1cv8.cf Абонемент ($m)

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

1 стартмани

22.07.2019    13547    68    sapervodichka    19    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    33839    ids79    27    

Свойства объектов 1С в MS SQL (и сравнение баз и расширений)

Статистика базы данных v8 v8::СКД 1cv8.cf Абонемент ($m)

Подключаемый отчет на системе компоновки данных по типам объектов 1С показывает: 1) Совокупности таблиц SQL для хранения объекта 1С и их предназначение; 2) Число объектов данного типа; 3) Размеры хранения данных и индексов в MB (мегабайтах); 4) Сравнение данных двух баз

1 стартмани

15.07.2019    13359    318    sapervodichka    11    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    28882    grumagargler    28    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    25139    YPermitin    14    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    19297    SeiOkami    50    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    48934    ids79    25