<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
САБЖ!
Жесть!
(2) ??? Типа страшно стало? 🙂
НЕ жесть!
А в 8-ке как с памятью?
(5) Если кто-то в 8-ке воспроизведет OnSave — тому, пожалуй, надо будет что-то круче пива поставить…
Именно из-за того что такое окно постоянно выскакивает после закрытия 1С, я и перестал заниматься разработкой внешних компонент. Так как никто не смог внятно объяснить что же это такое и почему так происходит, а кто знает — тот скромно молчит, упиваясь силою своего знания в магии 1С.
(7) Никакой магии… Если библиотека некорректно подчищает за собой (не разрушает объекты), окошко и будет вываливаться
(0) А подправленную NewAssignAndCompile_done я тебе, Планет, между дрочим высылал. Там ничего не выскакивало
(9) Твой вариант я посмотрел, но ты там проблему не решаешь, а от нее уходишь. Ты там применяешь перехват Ромикса для перекодировки модуля, но ты не создаешь в памяти новый модуль, а коварно используешь старый, созданный 1С, поскольку у тебя перекодировка идёт 1 к 1 по длине. Соответственно, ничего и не выскакивает. А ты попробуй обойтись без вот этого:
for i := 1 to Length(s2) do begin
t[i — 1] := s2[i];
— а сделай что-то вроде t:=@s2[1] — и выскочит таже фигня.
Глюк! t[i — 1] := s2[ i ]; — не пропечаталось 🙁
(7) Нет, ты не о том говоришь. ты говоришь о случае, когда забывают сделать Unassigned на переменные OleVariant, либо когда применяют дестрактор, а потом 1С его повторно вызывает. В моем же случае ошибка плавает, т.е. появляется спонтанно. Поэтому я и предполагаю, что иногда память выскакивает из адресного пространства 1С
(0) ну я бы начал с того, что
function TAddInObject.Done: HResult; stdcall;
begin
pm.UnPatch;
FreeAndNil(pm);
FreeAndNil(MyCompile);
Done := S_OK;
У тебя Init вызывается два раза (ВК экспортирует один объект), соответственно создаются два pm и два MyCompile. На второй итерации первые теряются. Возможно, поможет с багом
(13) Ошибка возникает вот тут:
if MyCompile.Test(UnitText) then
begin
NewUnitText:=MyCompile.Run(UnitText)+#0;
p:=@NewUnitText[1];
t:=StrNew(p); // !!!
asm
mov ecx, [ecx111];
mov eax, t; // ТУТ!
mov dword ptr[ecx+$54], eax;
end;
end;
Когда я создаю новый кусок памяти из StrNew и отдаю его в 1С. Читал как-то, что вначале любого перехвата нужно поставить петлю, т.е. зациклить процесс, иначе может произойти, что я буду переписывать asm-код, а он параллельно начнет выполняться. раньше думал на это. Но ромикс писал, что это здесь вроде решено.
Отличная идея! +1 ставлю не глядя.
А нельзя ли сделать закладку в настройках 1С, где будет включаться/выключаться этот Tracer? Также можно было б туда вынести и настройку вывода: либо в окно сообщений, либо в файл с указанным путем.
(14) Думал об этом и написал даже в топике. Планирую сделать, но хоцца вначале глюк побороть совместными усилиями. В asm я не тяну, а он скорее всего там.
(15) попробуй, воспроизводится-ли баг на:http://www.onlinedisk.ru/file/30560/
(17+) это я чето не то закинул, пардон. Не смотрите
(18) Выскочила ошибка сразу, но теперь память не в ноль уходит, а куда-то еще, и это — плюс: «Инструкция по адресу … обратилась к памяти по адресу 0х0539dab0» Попробую сейчас еще перекомпилировать все…
(18) так и знал… 🙂
Кстати, вроде догадался я, как лаг обойти. Надо проверить. И наверняка есть более хорошее решение.
Хорошая идея! +1
Также поддержу JohnyDeath по поводу включения/выключения
[/i]
P.S. Прикольный глюк — после 10 поста все сообщения идут курсивом — суппорту на заметку.
OnSave от Ромикса — это что? что-то не припомню
Ссылочку можно?
(0) ИМХО проблема в том, что 1С пытается самостоятельно удалить память, занятую под текст модуля. А так как память выделяется не 1С-ким new, а самостоятельно в Дельфи, структура памяти не совпадает и труба 🙁
Можно попробовать использовать системный вызов типа SysGetMem
(24+) или системный HeapAlloc — в принципе, 1С-кий new обращается к нему же.
(24+) Или вообще вычислить адрес функции malloc в любой dll-ке (basic, seven) и вызывать именно ее для выделения памяти под текст модуля.
(24+) Или перехватить деструктор CBLModule7 — ??1CBLModule7@@UAE@XZ — и перед выполнением оригинального деструктора обнулять поле текст модуля — dword ptr[ecx+$54] и удалять данный адрес через Дельфовский FreeMem
В этом случае 1C-кий delete (освобождение памяти) вызываться не будет !
(24+) Сам уже Дельфи довольно сильно подзабыл, к сожалению.
Все на МС С++ тружусь 🙂
Поэтому сам доработать не могу 🙁
Просто спасибо 🙂
(26) Я из всех вариантов думал только об этом, но схватить malloc из dll не знаю, как. 🙁
Кстати, по 24… Так понимаю, что 1С пытается освободить память под модуль не всегда в конце работы?
По 27 — сложно, потому что не все модули до этого были переопределены.
(31) Так ты же можешь в перехватчике AssignAndCompile сохранить адрес this (ecx) в каком-нибудь массиве/векторе и т.д., а в перехватчике деструктора проверить, если адрес this (ecx) есть в этом массиве, выполнять указанную обработку 🙂
.
У меня в 1С++ именно так и сделано для нормальной обработки/хранения модулей, также основанном на перехвате деструкторе CBLModule 🙂
(30) Да, в 1С юзается сборка мусора на основе ссылок, поэтому объекты освобождаются не всегда сразу же.
(32) Ок. Но на asm код не напишу 🙁
(34) Полная аналогия/копия с уже имеющимся кодом для АссигнАндКомпайл 🙂 — ИМХО один в один.
Что-то типа:
asm
mov [ecx111],ecx;
mov eax,[ecx+54h];
mov t,eax;
end;
if InAdrArray(t) then
begin
dispose(t);
asm
mov ecx, [ecx111];
mov eax, 0;
mov dword ptr[ecx+$54], eax;
end
end;
?
А в Init —
pm.DllNameToPatch:=’Basic.dll’;
pm.DllNameToFind:=’seven.dll’;
pm.FuncNameToFind:=’??1CBLModule7@@UAE@XZ’;
pm.NewFunctionAddr:=@NewCBLModule7;
pm.Patch;
?
да, похоже на правду
(38) было к 36
(37) pm.DllNameToPatch:=’Basic.dll’;
pm.DllNameToFind:=’seven.dll’;
а почему разные длл-ки? только seven.dll нужно вроде бы.
(39) Ненаю. Я взял так, как у Ромикса в OnSave. Кстати, вот на нее ссылка:http://www.x-romix.narod.ru/vk_OnSave.rar
Сейчас клиенту отправлю работу и буду все это пробовать…
Ну во! Не шпингале… Со спокойно душой плюсик поставлю 😉
(42) Ну не знаю… По трудоемкости и набору идей оно намного менее интересно, вообще-то.
(43)Это потому ка тык ромиксовскую взял почти готовую. Один фиг, мне это больше импонирует
Помереть — не встать !!! +5 баллов !!!
А то задолбало модули проведения отслеживать… Ж8-)))
> умная трассирочка
видимо кассирочка покоя не дает!
+1
зачетная вещь.. частенько мне ее не хватало…
Интересная деталь:
Я загрузил эту ВК в почти чистую базу.
Там все лишь одна обработка (это программа для расчёта по оплате электроэнергии для домашней бухгалтерии) 🙂
Дело не в этом.
Глобальный модуль там чистый. Ну и воткнул я туда это:
Показать полностью
dll в базу закинул.
Но когда запускаю 1С он всегда выкидывает это окно и закрывается, то есть никаким образом нельзя протестировать ВК.
А вот когда я это закинул в типовую ТиС — работать стало.
Может действительно есть здесь знатоки которые доработают эту ВК до ума.
Вешь очень полезная!!! Очень хотелось бы чтобы она работала идеально.
(49) Доработают. Сейчас проверю все то, что говорили с artbear, и если оно сработает, то считай, что сделали, а если нет, то у меня есть запасной ход.
<чуть слышно размышляя> Кстати, мож правда имеет смысл в Трассирочку переименовать? %)
Трассирочка???
Хммм…
Назвать конечно можешь как хочешь, но думаю это будет немного попахивать маразмом. Tracer 1C — это хорошее название.
Я уверен что и без названия вокруг этого ВК начнут ходить красивые легенды.
(51) Брось. Всего лишь обычный транслятор из GK, кстати, который навернул на OnSave за пару вечеров. Собственно, и на идею-то fixin натолкнул. Я понимаю, что выглядит необычно на фоне отчетиков, но спланировать и реализовать нормальный отчет намного сложнее.
Кому как наверное.
Мне например легче написать сложный отчёт, чем это.
Это и обсуждается иногда активно промеж топиков, типа, у кого длиннее: у того, кто пишет ВК или отчеты? Ты правильно сказал, что проще, потому что более знакомо. Но это не означает, что оно — сложнее. Если чел владеет методом, то ВК — проще, потому что они в основном для разрабов и восполняют отсутствие каких-либо функций оболочки. Тут задача вполне конкретна и вопрос чисто технический. Написание отчета требует знания предметной области, плюс — специфики конкретного клиента, плюс — разработать удобную реализацию, учесть возможность доработки. И на фоне всего этого ТЗ бывает достаточно расплывчатым, клиент зачастую не подозревает, что ему надо.
(54) Плюсик за:
— попытку (т.к. ВК состоится только после тестирования и отладки);
— за честное упоминание romix’a (с другой стороны, любая программа это умелое использование API и оберток над ними для достижения нужной цели).
А длиннее у того, кто пишет хорошо. И не важно, что пишет.
И среди ВК бывают перенумераторы.
Что приходит в функцию CString или PChar ?
Может можно освободить строку созданную 1С и подменить на строку из Delphi которую 1С освободит сама?
Если это CString, то могу поделиться кодом создания его в Delphi.
Плюнь на Дельфи, перепиши все на VC++ по технологии Rainbow и, возможно, будет толк.
(56+)
В фунцию вроде приходит CBLModule.
Что в нем по смещению 54h mov eax,[ecx+54h] ?
Не могу воспроизвести ошибку !!!???
Внешние обработки не перехватывает 🙁
Хм… Если используется готовая dll, то я там отключил функции дебаггера. По 54h лежит программный модуль, который трассирую.
Может так:
function c_malloc(size: Integer): Pointer; cdecl; external ‘msvcrt.dll’ name ‘malloc’;
procedure c_free(p: Pointer); cdecl; external ‘msvcrt.dll’ name ‘free’;
(60)
Использую исходники, правда Delphi 2006 🙂
54h это что-то в CBLModule, интересно что именно там, CString или PChar?
Если там CString то:
CString = PChar;
function c_malloc(size: Integer): Pointer; cdecl; external ‘msvcrt.dll’ name ‘malloc’;
procedure c_free(p: Pointer); cdecl; external ‘msvcrt.dll’ name ‘free’;
function CString_Create(capacity: integer): CString;
var p: Pointer;
begin
p := c_malloc(capacity + 13);
FillChar(p#k8SjZc9Dxk, capacity + 13, 0);
result := Pointer(Longword(p) + 12);
PInteger(p)#k8SjZc9Dxk := 1;
PInteger(Longword(p) + 4)#k8SjZc9Dxk := capacity;
PInteger(Longword(p) + 8)#k8SjZc9Dxk := capacity + 13;
end;
function CString_Init(cstr: CString; const s: string): CString;
begin
if cstr = nil then begin
result := CString_Create(Length(s) + 1);
end else
if PInteger(Longint(cstr) — 8)#k8SjZc9Dxk <= Length(s) then begin
CString_Done(cstr);
result := CString_Create(Length(s) + 1);
end else begin
result := cstr;
end;
StrCopy(result, PChar(s));
end;
procedure CString_Done(var cstr: CString);
begin
if cstr <> nil then begin
c_free(Pointer(Longword(cstr) — 12));
cstr := nil;
end;
end;
> что и без названия вокруг этого ВК начнут ходить красивые легенды.
..угум.. типа задолбали Опланета на инфостарте до того, что достал Опланет из-под полы свой инструмент и показал, что есть еще ягоды в ягоди..тьфу, порох в пороховницах…
😉
То, о чем говорили с artbear не сработало. Предполагаю свои кривые ручонки. Но кому интересно, выкладываю отдельно AddInObj.pas
(61) А где с_free вызвать? Оно по ходу вызывается в 1С. Попробую сейчас с с_malloc…
Кстати, MMF прислал сейчас dll, которая стала в 2 раза меньше размером, и по ходу не глючная 😉
(64) Просто удачно совпали праздники с отсутствием у меня на их период инета и с профукованием всвязи с этим хорошего заказа, вот и отдыхаю от 1С чуть-чуть 🙂
(65)
с_free вызвать для того что 1С уже хранит.
А с_malloc для своей строки вместо t.
Может MMF, поделится исходником?
Может и поделится. Но пока молчит 🙂
ЫЫЫ!!! А с c_malloc вроде все ОК РАААББОООТТАААЕЕТТТ!!!! :))))
ОБНОВИЛ ФАЙЛЫ, ПРОВЕРЯЙТЕ
(69) Это замечательно 😉
Но если там CString, то может слететь 🙁
Artbear, что там CString или PChar ?
(71) Вообще, я взял из того, что ты написал, всего лишь function c_malloc(size: Integer): Pointer; cdecl; external ‘msvcrt.dll’ name ‘malloc’; и заменил им StrNew 🙂 Думаю, достаточно, потому что теперь 1) гарантированно попадаю в пространство 1С 2) 1С сама отвечает за удаление. Перехватить очистку не получилось: не силен я в асме
А кто очистит память зарезервированную 1С?
Она же. Или ты имеешь ввиду те модули, которые я переопределяю, и которые теряются? Хм… Сейчас.
(69) сколько мало нужно Программеру для счастья 😉
предлагается чтоб была возможность трассировку складывать не в табло сообщений а в тектсовый файли (задаваемый, например, в качестве «параметра» при инициализации ВК или в ини-файле)…
Обновил.
По поводу перспектив развития.
___________________________
1. Хочу добавить возможность управлять форматом вывода объектов на уровне 1С, а именно, если в модуле имеется функция Трассирочка(Сообщение,ИмяПеременной,ЗначениеПеременной), то передавать все сообщения и объекты ей
2. Планирую добавить в Сервис настройку, а именно:
— вкл/откл трассировки
— вкл/откл сообщений трассировки по входу в процедуры
— вкл/откл сообщений трассировки по выходу из процедуры
— вкл/откл сообщений трассировки по входу в условные операторы
— вкл/откл сообщений трассировки по присвоенным значениям
Вот думаю, имеет ли смысл добавить сообщения на итерациях цикла?
(77) в целом — да…
но будет ли учтено, что если в функции стоит МОЯ ДИРЕКТИВА «TRACEOFF» — то трассировать, допустим, эту процедуру/функцию (и все вложенные) — не надо…???
+ отсюда сразу же возможность учета/игнорирования МОИХ ДЕРЕКТИВ.
+ управление хочется осущетвлять извне — т.е. допустим выключена трассировка — идет.. опа «кривизна» пошла — а перезапускать накладно — извне в ини файл подсовываю управляющую дитрективу — опа трассировка включилась…
+ пожелание: более полно формализовать трассировочные сообщения, для облегчени я последующего парсинга
..
на рис.1 — ошибка:
>> вход в функцию ПересчетСуммыВзаиморасчетов
<< выход ИЗ ПРОЦЕДУРЫ
в случае вывода значений агрегатных типов хочется иметь не просто типа
возвращаемое значение: USD, а также и «ИД» объекта, позволяющий его быстро локализовать — ЗначениевСтрокуВнутр (???)
.. или в виде
возвращаемое значение: Петров :: Справочник.Контрагенты :: ЗначениевстрокуВнутр
возвращаемое значение: Поступление (купля-продажа) :: Перечисление.ВидыОпераций.Закупка :: ЗначениевстрокуВнутр
вообще, конечно, если доведешь до ума — это тянет на лучшую разработку/идею года.
убедительная просьба — не кидать на полпути!!!
Формат выдаваемых сообщений предлагайте. Готов рассмотреть варианты. Можно вообще предложить настраиваемый формат, типа «включить в строку ЭТО»
>> но будет ли учтено, что если в функции стоит МОЯ ДИРЕКТИВА «TRACEOFF» — то трассировать, допустим, эту процедуру/функцию (и все вложенные) — не надо…???
Это уже реализовано. только пиши по тексту с пробелом:
//TRACER OFF
…
//TRACER ON
>> в ини файл подсовываю управляющую дитрективу — опа трассировка включилась
это надо обсуждать
(82) Вообще, лучшая идея года — впереди. Даже две 🙂 Ты забыл о … <в поисках Vip-а>
Если разработка действительно окажется кому-то полезной, то справедливости ради стоит упомянуть fixin-а. если бы он не создал тот топик, за который, кстати, нахватал минусов, то ничего бы не было, ни моей идеи, ни дружной работы по устранению бага.
> Формат выдаваемых сообщений предлагайте.
думайте! думайте!
должно быть легко идентифицируемо/отделяемо
— служебная часть сообщения (вход в проц, выход, условие иначе и т.д.)
— содержательная часть сообщения, причем чтобы понять к чему относится содержательное часть — не лезть вверх по служебным сообщениям… и т.д.
на итерациях цикла — только если включать где-то принудительно, в прочих случаях типа:
>>> вход в цикл старт=1 стоп=873
<<< выход из цикла при старт = 530 (т.е. например сработало «прервать»)
+ возможно опционально задавать настройку отступов ступеньками — таким образом оттрассировав можно получить вполне себе читабельный код!
ОФИЦИАЛЬНО ЗАЯВЛЯЮ СВОИ ПРАВА НА СЛОГАН
«ОТТРАССИРОВАТЬ КАССИРОЧКУ»
!!!
Планет, если ты кроме Result:=’;Сообщить(«‘ доделаешь еще возможность (на выбор)
pEvent.ExternalEvent(‘tracer’, КатегорияСобытия, ОписаниеСобытия); на мой взгляд будет истчо лучше 😉
(90) Это получится какая-то жесть. Можно будет смело ставить клиентам и при умелом обращении, обычная трассировка превращается в планомерное убисство. Хочет впечатлительная девушка, например, открыть накладную, а накладная на ее глазах помечается на удаление, из нее пропадают строки, меняются цифры…
Есть одна забавная багофича. Трассер отслеживает только код в составе MD (под это и заточен), в ситуации когда модуль подгружается из внешнего файла
#ЗагрузитьИзФайла ExtModulesСправочникиКонтрагентыМодульЭлемента.txt, имеем:
<<?>>//*** Traced by O-Planet
{Справочник.Контрагенты.Форма.Модуль(1)}: Обнаружено логическое завершение исходного текста модуля
и затык, элемент не открывается! Планет, сам поправишь? 😉
Надо проверочку на первую строчку кода на #ЗагрузитьИзФайла
+(94) Вот так, например, трабл решается:
if MyCompile.Test(UnitText) and (Pos(‘#ЗагрузитьИзФайла’,t)=0) then
begin
NewUnitText:=MyCompile.Run(UnitText)+#0;
………………………………………..
(71) Вообще там, конечно, CString 🙂
Но приведенный код вроде как должен работать.
Самый правильный вариант — родные сишные malloc и free.
класс!!!
нет ничего дороже идеи… думаю кто голосовал «+» должны проголосовать и за fixin-а… хотя он и имел ввиду другую трассировку (48) …
вооо-оо-от мнение…
Так как там CString, стоит использовать его, пример (63).
Планируется трассировка внешних обработок/отчетов (.ERT)?
мой (79) пост — что по поводу ошибки на рис.1
???
(79) и (129) исправлено
(135) — это хорошо!
при подключении глТрейсер.ExtTracer() (Пропадают первые буквы):
лСформироватьСообщениеТрассировки<<?>>(Ключ,Имя,Зн);
{Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(9)}: Процедура не обнаружена (лСформироватьСообщениеТрассировки)
<<?>>ункция СформироватьШтрихкод(Весовой, Код)
{Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(14)}: Переменная не определена (ункция)
Return Tracer___Ret<<?>>;
{Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(96)}: Процедура не может возвращать значения
<<?>>КонецФункции
{Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(99)}: Ожидается ключевое слово ‘КонецПроцедуры’ (‘EndProcedure’)