• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Проверте Код 1с

  • Автор темы Brenli
  • Дата начала
B

Brenli

Доброго времени.
1С 7.7 ТиС
В связи с огромным размером БД возникла необходимость в обрезке базы, стандартная обработка свёртки плохо работает так как конфа не типовая, и готовить базу к свёртке делая профилактику занимающую неделю по времени,....времени нет.....
Решил написать загрузку выгрузку товарных остатков , остатков по кассе и взаиморасчёты.
Так как учёт в организации партионный важно знать от какого поставщика какой товар. Проблемма в следующем: остатки я получил очень просто с помощью запроса, а вот с партиями беда.....данные из регистра партии в наличии ....мягко скажем кривые, и данные оттуда брать проблемно.

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


<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Код:
Процедура СформироватьДанныеПоТоварам(ДБФ)

ДокПост = СоздатьОБъект("Документ.ПоступлениеТМЦ");
ТЗ		= СоздатьОБъект("ТаблицаЗначений");


// **************Запрос к регистру остатков***********************
Запрос = СоздатьОБъект("ЗАпрос");

ТекстЗапроса = " 
|С НачДата По НачДата;
|Фирма = Регистр.ОстаткиТМЦ.Фирма;
|Склад = Регистр.ОстаткиТМЦ.Склад;
|Товар = Регистр.ОстаткиТМЦ.Номенклатура;
|Количество = Регистр.ОстаткиТМЦ.Количество; 
//	|Поставщик = Регистр.ОстаткиТМЦ.ТекущийДокумент.ПоступлениеТМЦ.Контрагент; 
|Группировка Товар Без Групп;
|Группировка Фирма Без Групп;
|Группировка Склад Без Групп;
|Функция КОст = КонОст(Количество);
//|Условие (Фирма = ВыбФирма);
//|Условие (ВыбСклад = Склад);
|";

Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Возврат;
КонецЕсли;

Если Запрос.Выгрузить(ТЗ,0,0)=0 Тогда
Возврат; 
КонецЕсли;

// *************Добавим к таблице 3 колонки*******************************
ТЗ.НоваяКолонка("ЦенаЗак","Число",10,2);
ТЗ.НоваяКолонка("Флаг","Число",1);
ТЗ.НоваяКолонка("Поставщик","Справочник.Контрагенты");

// *********Найдём последнего поставщика от которого приходил товар******************	
ТЗ.ВыбратьСтроки();
Сч			= 0;
_Булево 	 = 0;  
_СтрПоиска	= 0; 
_ТоварБуфер  = ""; 
_КонтрБуфер  = "";
_ЦенаЗакБуфер = 0; 

ТЗ_Док = СоздатьОбъект("ТаблицаЗначений"); 

Пока ТЗ.ПолучитьСтроку()=1 Цикл
Сч = Сч + 1;	  
//====================================================
//Добавил установку значения из буфера чтобы не перебирать лишний раз документы
// в случае если товар идентичен но фирма и склад различны	
Если ТЗ.Товар = _ТоварБуфер Тогда
ТЗ.УстановитьЗначение(Сч,"Поставщик",_КонтрБуфер);	
ТЗ.УстановитьЗначение(Сч,"Флаг",1); 
ТЗ.УстановитьЗначение(Сч,"ЦенаЗак",_ЦенаЗакБуфер);
Сообщить("<<<< Установлен поставщик из буфера "+ ТЗ.Товар);
Продолжить;
КонецЕсли;
//====================================================
ДокПост.ОбратныйПорядок(1);
ДокПост.ВыбратьДокументы();
Пока ДокПост.ПолучитьДокумент()=1 Цикл 



ТЗ_Док.УдалитьСтроки();

СчСтр = 0;

ДокПост.ВыгрузитьТабличнуюЧасть(ТЗ_Док);

Если Тз_Док.НайтиЗначение(ТЗ.Товар,СчСтр,"Номенклатура")=0 Тогда
Продолжить;
Иначе	
ТЗ.УстановитьЗначение(Сч,"Поставщик",ДокПост.Контрагент);	
ТЗ.УстановитьЗначение(Сч,"Флаг",1);
ТЗ.УстановитьЗначение(Сч,"ЦенаЗак",Тз_Док.ПолучитьЗначение(СчСтр,"Цена"));

_ЦенаЗакБуфер = Тз_Док.ПолучитьЗначение(СчСтр,"Цена");
_ТоварБуфер  = ТЗ.Товар;
_КонтрБуфер  = ДокПост.Контрагент;	

Сообщить(" Установлен флаг <1> "+Тз_Док.ПолучитьЗначение(СчСтр,"Номенклатура"));
Прервать;
КонецЕсли;
КонецЦикла; 


Если ТЗ.Итог("Флаг")=ТЗ.КоличествоСтрок() Тогда
Сообщить(" !!ALERT!! Cработало условие выхода ");
Прервать; //цикл по документам
КонецЕсли;
Сообщить(Сч);
КонецЦикла;
//***********Заполним файл базы данных скомпоноваными значениями***************

ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
ДБФ.Добавить();
ДБФ.Name = Строка(ТЗ.Товар);
ДБФ.Firma = Строка(ТЗ.Фирма);
ДБФ.Sklad = Строка(ТЗ.Склад);
ДБФ.Kontr = Строка(ТЗ.Поставщик);
ДБФ.Cena = ТЗ.ЦенаЗак;
ДБФ.Flag = ТЗ.Флаг; 
ДБФ.Записать();
КонецЦикла;

КонецПроцедуры //СформироватьДанныеПоТоварам() 

//******************************************************************************
// Выгрузить()
//
// Параметры: 
// 
//
// Возвращаемое значение:
// Нет
//
// Описание:
// ТекстОписания
//
Процедура Выгрузить() 

НачатьТранзакцию();
//************Структура файла БД для Товаров*****************	
ДБФ = Создатьобъект("XBase"); 

ДБФ.ДобавитьПоле("Name",		2,100,);
ДБФ.ДобавитьПоле("Firma",		2,100,);
ДБФ.ДобавитьПоле("Sklad",		2,100,);
ДБФ.ДобавитьПоле("Cena",		1,15,2);
ДБФ.ДобавитьПоле("Kontr",		2,100,);
ДБФ.ДобавитьПоле("Flag",		1,1,);

ДБФ.СоздатьФайл("C:\dbUpload.dbf"); 
ДБФ.Записать();	  
СформироватьДанныеПоТоварам(ДБФ);
/////////////////////////////////////////////////////////////
//************Структура файла БД для расчёты Покупатели******	
ДБФПок = Создатьобъект("XBase"); 

ДБФПок.ДобавитьПоле("Kontr",	 	2,100,);
ДБФПок.ДобавитьПоле("Firma",	 	2,100,);
ДБФПок.ДобавитьПоле("Dolg",			1,15,2);
//
//ДБФПок.СоздатьФайл("C:\dbPokup.dbf"); 
//ДБФПок.Записать();	 
//ВзаиморасчетыПокупатели(ДБФПок);
/////////////////////////////////////////////////////////////
//************Структура файла БД для расчёты Поставщики******	
ДБФПост = Создатьобъект("XBase"); 

ДБФПост.ДобавитьПоле("Kontr",		2,100,);
ДБФПост.ДобавитьПоле("Firma",	 	2,100,);
ДБФПост.ДобавитьПоле("Dolg",		1,15,2);


//ДБФПост.СоздатьФайл("C:\dbPo3st.dbf"); 
//ДБФПост.Записать();	 
//ВзаиморасчетыПоставщики(ДБФПост); 
/////////////////////////////////////////////////////////////

//ОстаткиПоКассе(); 


ЗафиксироватьТранзакцию();
КонецПроцедуры //Выгрузить()

Прошу посмотреть опытных и проверить
 
U

unknown181538

Идея нормальная, имхо)
А вот на ИТС написано, что начинать переменные с "_" некошерно)
 
P

puh14

Эххх.. выложу-ка я старую обработочку по свертке скульной базы (предупреждаю сразу - это рабочий костыль нагло лезущий в БД, а не оконченый инструмент. Так как свою задачу он выполнил - то дальнейшего развития не получил). Особенность костыля - когда меня попросили свернуть базу, то было поставлено условие - убиваем не все документы до даты свертки, а только не "закрытые", ну например оставляем реализации неоплаченные. Что было придумано - в первой версии были перенесены остатки по всем регистрам на определенную дату , а у документов до даты свертки были убиты движения по регистрам. Через какое-то время пользователи преодолели табу на залезание в старые доки и провели их. Остатки соответственно клинануло. Поэтому было добавлено нивелирование движений по регистрам для оставшихся документов. За перенос остатков отвечал отдельный документ, у которого не было ничего, кроме текста модуля проведения( тоже до безобразия простого).

первая часть -выгрузка остатков

Процедура Сформировать()
Тз = СоздатьОбъект("ТаблицаЗначений");
//ДатаКонца = СформироватьПозициюдокумента(ДатаОстатков,23,59,59,0);
ДатаКонца = ПолучитьПозициюТА();
Для ааа = 1 по Метаданные.Регистр() Цикл
Если метаданные.регистр(ааа).ТипРегистра = "Обороты" Тогда
Продолжить
КонецЕсли;
Запрос = СоздатьОбъект("Запрос");
СтрокаСверткиИзмерение = "";
СтрокаСверткиРесурс="";
ИмяРегистра = Метаданные.Регистр(ааа).Идентификатор;

ТекстЗапроса ="Период с ДатаКонца По ДатаКонца;
|Без Итогов;" +РазделительСтрок;
СчетчикЦикла = 0;

//выводИзмерений
Для ффф = 1 По Метаданные.Регистр(ааа).Измерение() Цикл
ТекстЗапроса = ТекстЗапроса + Метаданные.Регистр(ааа).Измерение(ффф).Идентификатор + " = Регистр." + Метаданные.Регистр(ааа).Идентификатор + "." + Метаданные.Регистр(ааа).Измерение(ффф).Идентификатор + ";" +РазделительСтрок;
СтрокаСверткиИзмерение = СтрокаСверткиИзмерение + ?(ффф = 1,Метаданные.Регистр(ааа).Измерение(ффф).Идентификатор,"," + Метаданные.Регистр(ааа).Измерение(ффф).Идентификатор);
КонецЦикла;
//ВыводРесурсов
Для ффф = 1 По Метаданные.Регистр(ааа).Ресурс() Цикл
ТекстЗапроса = ТекстЗапроса + "Ост" + Метаданные.Регистр(ааа).Ресурс(ффф).Идентификатор + " = Регистр." + Метаданные.Регистр(ааа).Идентификатор + "." + Метаданные.Регистр(ааа).Ресурс(ффф).Идентификатор + ";" +РазделительСтрок;
СтрокаСверткиРесурс = СтрокаСверткиРесурс + ?(ффф = 1,Метаданные.Регистр(ааа).Ресурс(ффф).Идентификатор,"," + Метаданные.Регистр(ааа).Ресурс(ффф).Идентификатор);
КонецЦикла;
//группировки измерений
Для ффф = 1 По Метаданные.Регистр(ааа).Измерение() Цикл
ТекстЗапроса = ТекстЗапроса + "Группировка " + Метаданные.Регистр(ааа).Измерение(ффф).Идентификатор + " без Групп;" +РазделительСтрок;
КонецЦикла;
//Расчет функций
Для ффф = 1 По Метаданные.Регистр(ааа).Ресурс() Цикл
ТекстЗапроса = ТекстЗапроса + "Функция " + Метаданные.Регистр(ааа).Ресурс(ффф).Идентификатор + " = КонОст(Ост" + Метаданные.Регистр(ааа).Ресурс(ффф).Идентификатор + ");" +РазделительСтрок;
КонецЦикла;

Запрос.Выполнить(ТекстЗапроса);
Запрос.Выгрузить(ТЗ);
Тз.Свернуть(СтрокаСверткиИзмерение,СтрокаСверткиРесурс);
Текст = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку(ЗначениеВСтроку(ТЗ));
Текст.записать(КаталогИБ() + "\Остатки\" + ИмяРегистра +".txt");

КонецЦикла;

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

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

Процедура ОбработкаПроведения()
Тз = СоздатьОбъект("ТаблицаЗначений");
Док = СоздатьОбъект("Документ");
Для ааа = 1 по Метаданные.Регистр() Цикл
Если метаданные.регистр(ааа).ТипРегистра = "Обороты" Тогда
Продолжить
КонецЕсли;
ИмяРегистра = Метаданные.Регистр(ааа).Идентификатор;
Текст = СоздатьОбъект("Текст");
ИмяКаталога = каталогИБ() + "\остатки\";


Попытка

Текст.открыть(имяКаталога + ИмяРегистра + ".txt");


Исключение
Продолжить
КонецПопытки;
Вывод = Текст.ПолучитьСтроку(1);
Тз.Загрузить(ЗначениеИзСтроки(Вывод));


Рег = Регистр.ПолучитьАтрибут(ИмяРегистра);
Если Тз.КоличествоСтрок() = 0 Тогда
Продолжить;
КонецЕсли;

Для ффф =1 по Тз.КоличествоСтрок() Цикл
Пропустить = 0;
Для ыыы = 1 по Тз.КоличествоКолонок() Цикл
ИмяКолонки = Тз.ПолучитьПараметрыКолонки(ыыы);
ЗначениеКолонки = Тз.ПолучитьЗначение(ффф,ыыы);
Если (ТипЗначенияСтр(ЗначениеКолонки) = "Документ") Тогда
Если Тз.ПолучитьЗначение(ффф,ыыы).Выбран() = 0 Тогда
Пропустить = 1;
Продолжить;
КонецЕсли;
КонецЕсли;
Рег.УстановитьАтрибут(имяКолонки,ЗначениеКолонки);
КонецЦикла;
Если пропустить = 0 Тогда
Рег.ДвижениеПриходВыполнить();
КонецЕсли;

КонецЦикла;

Попытка
Текст.открыть(имяКаталога + "Dvizenie"+ИмяРегистра + ".txt"); //25,08,11 Пушкарев

Исключение
Продолжить
КонецПопытки;
Вывод = Текст.ПолучитьСтроку(1);
Тз.Загрузить(ЗначениеИзСтроки(Вывод));


Рег = Регистр.ПолучитьАтрибут(ИмяРегистра);
Если Тз.КоличествоСтрок() = 0 Тогда
Продолжить;
КонецЕсли;

Для ффф =1 по Тз.КоличествоСтрок() Цикл
Пропустить = 0;
Для ыыы = 1 по Тз.КоличествоКолонок() Цикл
ИмяКолонки = Тз.ПолучитьПараметрыКолонки(ыыы);
ЗначениеКолонки = Тз.ПолучитьЗначение(ффф,ыыы);
Если (ТипЗначенияСтр(ЗначениеКолонки) = "Документ") Тогда
Если Тз.ПолучитьЗначение(ффф,ыыы).Выбран() = 0 Тогда
Пропустить = 1;
Продолжить;
КонецЕсли;
КонецЕсли;
Рег.УстановитьАтрибут(имяКолонки,ЗначениеКолонки);
КонецЦикла;
Если Пропустить = 0 Тогда
Рег.ДвижениеПриходВыполнить();
КонецЕсли;

КонецЦикла;
кОНЕЦцИКЛА;

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


собственно тут видно, что кроме файлов остатков есть файлы движения оставшихся документов по регистрам. Что я ещё не выложил - удаление документов по списку прямым запросом к базе и выгрузку движений оставленных документов. Если интересно - выложу. Для переноса остатков в чистую от документов базу достаточно и этого. Только сейчас сообразил - самое сладкое( убиение документов ) я так и не выложил. ;-)


в дополнение - партионный учет в 1с сильно кастрирован, фифо и лифо практически убивают ( у меня в основном работа по медикаментам, а там крайне жесткие требования к товарам). Посему партия - это у меня уникальный элемент для каждой строчки документов дыижения товаров. и в ней живет практически ВСЁ - ставка НДС. поставщик, цены реестровые, цены поступления, документы первичного прихода , производители, сертификаты разные - короче всё что мне может понадобиться по запросам к товарам. Рекомендую топикстартеру добавить производителя и строчное представление документа поступления в справочник партииТМЦ и заполнить их по документам прихода. А потом будет пофиг - есть ли документы поступления, или нет.

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

Вложения

  • Свертка_базы_1.1.7z
    8 КБ · Просмотры: 159
  • Формирование_txt_с_движениями.7z
    6,7 КБ · Просмотры: 161
V

vbs

Что-то я, видимо, не очень понял проблему с партиями. Я еще лет восемь назад
вышел из из этого простым способом - внедрил выгрузку в стандартный отчет "Ведомость по партиям".
Вот кусочек кода :
Код:
			DBF.Add();
DBF.Kod = Запрос.Номенклатура.Код;
DBF.Rest = Запрос.КонОстК; 
DBF.Price = Запрос.КонОстС/Запрос.КонОстК;
DBF.Sum = Запрос.КонОстС;
DBF.Post = Запрос.Поставщик.Код;
DBF.Save();

Дальше - импорт из соданного файла (на выбор - создаем документы "ПоступлениеТМЦ" или "ВводНачальныхОстатковТМЦ").
Разумеется, при создании новых документов придется озаботиться созданием новых элементов справочника "Партии" для
каждой номенклатуры.
Базы я резал раз пятнадцать, не меньше. Особых траблов не наблюдал...
 
B

Brenli

vbs
Проблема с партиями заключается в их бардаке.
База не резалась очень давно, лет 5 наверное.
В партиях бардак полный, например фактический остаток Товара 10 шт а в партиях несколько партий не списанных , то плюсы то минуса...
короче информация не актуальная.
 
B

Brenli

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

Allexei

Прочитайте про РАУЗ и про ведение "партионного" учета в нем. Может сможете реализовать :unsure:
 
P

puh14

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

А насчет партий - ну раз такой бардак, то капут. Прими волевое решение - партия остаток, себестоимость такая-то и "начать жизнь с чистого листа". Бухам по идее должно быть пофигу - учет явно ведется по среднему. Чтобы бухам было не пофигу - уходи от учета по среднему, как только задним числом доки поменяют себестоимость поползет, сами взвоют. У меня перенос самописный, в типовой бух для расхода убиты проводки по 41 счету. В конце месяца переносится из склада себестоимость ручными операциями через другую обработочку. Если кто задним числом в склад полез и приход поменял - обороты в бухгалтерии не сойдуться с торг-29 по складу, а они это очень быстро заметят.
 
P

puh14

Их конечно - стандартно очень медленно выходило.
 
B

Brenli

Доброго времени
Прошу помоч с идеей.
Выгрузили данные, получили ДБФ файл, следующей структуры:


Товар1 Склад1 Фирма1 Поставщик1
Товар1 Склад2 Фирма2 Поставщик1
Товар1 Склад3 Фирма1 Поставщик1

Товар2 Склад2 Фирма3 Поставщик2
Товар2 Склад2 Фирма2 Поставщик2
Товар2 Склад3 Фирма1 Поставщик2

Товар, на каждой фирме, на каждом складе, от поставщика....

Планируется что будет создаваться документ Ввод остатков ТМЦ.
Прошу совета, как бы это более лаконично написать.
Заранее благодарен
 
P

puh14

Минус ДБФ-а в том,что обзывать колонки кириллицей некошерно и наименование колонки то ли 8, то ли 10 символов. Всякие получитьатрибут/установитьатрибут не прокатят. Так что всё придется писать руками - у тебя же нет реквизитов документа латиницей. А касательно чтобы покрасивше - так как поставщик, склад и фирма живут в шапке ввода остатков - делаешь цикл по дбф. В первой строчке определяешь начальные значения склада, поставщика и фирмы. Пока они не изменились добавляешь строчки с товаром в вновь созданный документ. Как хоть один поменялися, записываешь текущий документ, и создаешь новый. И так далее, до победного конца.
 
B

Brenli

ТекстЗапроса = "
|SELECT
| Док.IDDoc as [Док $Документ.Реализация]
|FROM
| $Документ.Реализация as Док
|WHERE
| $Док.Контрагент = $ПустойИД13 OR
| $Док.Склад = $ПустойИД";

Доброго времени
подскажите что значит в данном случае $Док....таблица то которую вернёт метапарсер имеет алиас Док,
для чего тогда в $ перед Док в условии?
 
V

vbs

Минус ДБФ-а в том,что обзывать колонки кириллицей некошерно и наименование колонки то ли 8, то ли 10 символов
Уж это точно - 8 символов латиницей, начиная с буквы - лучше всего
Всякие получитьатрибут/установитьатрибут не прокатят
Прокатит ПолучитьЗначениеПоля("N"), где N - номер поля

Запрос здесь ни к чему - цикл по ДБФ, как верно указал puh14
 
P

puh14

подскажите что значит в данном случае $Док....таблица то которую вернёт метапарсер имеет алиас Док,
для чего тогда в $ перед Док в условии?

Для интереса вруби для рекордсета рекордсет.отладка(1) и увидишь что за запрос идет на скуль.
А тут все логично - надо превратить идетнтификатор колонки Склад в идентификатор колонки скуля (типа sp1540). А то что запрос вернет табличку с документами - это уже не скулевая часть, а 1сpp. Скуль вообще ни про какие объекты знать не знает.

кстати - НИКОГДА не забывай добавлять выражение with nolock после имен таблиц данных. Просто по умолчанию select блокирует записи которые ты выбрал. И если в этот момент кто-то попробует записать документ попавший к тебе в выборку - то будут непонятки с пользователем.
 
P

puh14

Запрос здесь ни к чему - цикл по ДБФ, как верно указал puh14
Да он судя по всему решил попробовать себя в скуле. Молодца.

Прокатит ПолучитьЗначениеПоля("N"), где N - номер поля

Я просто несколько "повернулся" на универсальности. Посему цикл с получить атрибут/установить атрибут почти всегда использую.
 
B

Brenli

Подскажите что не так,

Код:
	ЗагрузитьВнешнююКомпоненту("1CPP.dll");
Запрос = СоздатьОБъект("ODBCRecordset");

ТекстЗапроса = "
|SELECT 
|	Спр.Code as Код,
|	Спр.Descr as Наименованиеss
|	$Спр.БазоваяЕдиница as БазоваяЕдиница //<----что не так в этой строке
|FROM
| $Справочник.Номенклатура as Спр";
Запрос.Отладка(1);
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);  

ТЗ.ВыбратьСтроку()

БазоваяЕдиница это реквизит элемента номенклатуры, но когда я добавляю такую строку в запрос, происходит ошибка
 
B

Brenli

В отладке оно правильно отображает поле в ТЗ но не выводит значение
 
B

Brenli

Ошибку нашёл,
Во первых не было преобразования, во вторых запятую забыл :rolleyes:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!