• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Программно создать номенклатуру в 7.7

  • Автор темы Автор темы Спартак
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
С

Спартак

Доброго времени суток!
Ситуация такая... Переношу номенклатуру из УСН 7.7 в ТиС. Обе хорошо переписаны. Решил написать 2 обработки: 1-я выгружает из УСН в dbf, вторая - загружает из dbf в ТиС. столкнулся с проблемой заполнения базовой единицы измерения. Подскажите, как в 7-ке работать с подчиненными справочниками??
 
даж не знаю что бы посоветовать.. пожалуй почитать ;)
По идее ведь выбираешь элемент из подчиненного справочника и присваиваешь это значение одному из реквизитов нужного элемента справочника
 
если бы все было так просто...

ед = СоздатьОбъект ("Справочник.ОКЕИ");
ед.НайтиПоНаименованию ("шт", 1);
спр = СоздатьОбъект ("Справочник.Номенклатура");
спр.Новый ();
спр.Наименование = "товар";
спр.БазоваяЕдиница = ед.ТекущийЭлемент ();
спр.Записать ();

вот это срабатывает без ошибок, но базовая единица не появляется ;)
 
погляди в отладчике - находится ли ед - может там просто пустое значение.
 
единица находится. а ед лежит ссылка на нее
 
Если спр. Единицы подчинен спр. Номенклатура, тогда надо сначало записать элемент номеклатуры без единицы, а потом уже записать единицу - потому что владельца сначала надо записать, а потом уже подчиненный справочник дергать.
 
Код:
 ед = СоздатьОбъект ("Справочник.ОКЕИ");
ед.НайтиПоНаименованию ("шт", 1);
спр = СоздатьОбъект ("Справочник.Номенклатура");
спр.Новый ();
спр.Наименование = "вуцвуццув";
спр.Записать ();			  
спр.БазоваяЕдиница = ед.ТекущийЭлемент();
спр.Записать ();

та же самая фигня... базовой единицы нет :(
 
1. У спр.БазоваяЕдиница тип точно "Справочник.ОКЕИ"?

2. Справочник.ОКЕИ - подчиненный?

3. Что показывает отладчик на спр.БазоваяЕдиница после спр.Записать (); ?
 
Вот тебе пример :

Function RefFindC(Mode,Code)
RefC = CreateObject("Reference."+Mode);
if RefC.FindByCode(Code) = 0 then
RefC.New();
if Mode = "ОКЕИ" then
RefC.Code = Code;
endif;
RefC.Write();
Message("--->В справочник "+Mode+" добавлен элемент "+RefC.Наименование);
endif;
Return RefC.CurrentItem();
EndFunction
//-----------------------------------

Function RefFindD(Mode,Name)
RefD = CreateObject("Reference."+Mode);
RefD.UseOwner(ТекущийТовар);
if RefD.FindByDescr(Name) = 0 then
RefD.New();
if Mode = "Единицы" then
RefD.Code = TrimALL(DBF.Field105);
RefD.Наименование = DBF.Field106;
RefD.ОКЕИ = ОКЕИ;
RefD.Коэффициент = 1;
endif;
RefD.Наименование = Name;
RefD.Write();
Message("--->В справочник "+Mode+" добавлен элемент "+RefD.Наименование);
endif;
Return RefD.CurrentItem();
EndFunction
//**************************************************************************
Ref = CreateObject("Reference."+Mode);
// Создаем новый элемент - сокращено для экономии
if Mode = "Номенклатура" then
Ref.Write();
ТекущийТовар = Ref.CurrentItem();
ОКЕИ = RefFindC("ОКЕИ",TrimALL(DBF.Field105));
Ref.БазоваяЕдиница = RefFindD("Единицы",TrimALL(DBF.Field106));
Ref.Write();
endif;

Добавлено:
ед = СоздатьОбъект ("Справочник.ОКЕИ");
ед.НайтиПоНаименованию ("шт", 1);
спр = СоздатьОбъект ("Справочник.Номенклатура");
спр.Новый ();
спр.Наименование = "товар";
спр.БазоваяЕдиница = ед.ТекущийЭлемент ();
спр.Записать ();
Для твоего случая надо делать так :
спр = СоздатьОбъект ("Справочник.Номенклатура");
спр.Новый ();
спр.Наименование = "товар";
спр.Записать ();
ед = СоздатьОбъект ("Справочник.Единицы");
ед.ИспользоватьВладельца(спр.ТекущийЭлемент ());
ед.НайтиПоНаименованию ("шт", 1); .// но сработает только, если длина наименования не 0
// иначе надо найти наименование в справочнике ОКЕИ и потом использовать
//ед.НайтиПоРеквизиту("ОКЕИ")
спр.БазоваяЕдиница = ед.ТекущийЭлемент ();
спр.Записать ();
 
vbs, чисто так - для саморазвития... разве нельзя сразу найти ед.НайтиПоНаименованию("шт", 0) и передавать ссылку?
 
vbs, чисто так - для саморазвития... разве нельзя сразу найти ед.НайтиПоНаименованию("шт", 0) и передавать ссылку?
В справочнике "единицы" в ТиС обычно наименование и код равны 0

Добавлено: Точнее, надо создавать новую единицу (ибо товар новый) так:

единицы = СоздатьОбъект ("Справочник.Единицы");
ед = СоздатьОбъект ("Справочник.ОКЕИ");
ед.НайтиПоНаименованию ("шт", 1);
спр = СоздатьОбъект ("Справочник.Номенклатура");
спр.Новый ();
спр.Наименование = "товар";
спр.Записать ();
единицы.ИспользоватьВладельца(спр.ТекущийЭлемент ());
единицы.Новый ();
единицы.ОКЕИ = ед.ТекущийЭлемент ();
единицы.Записать ();

спр.БазоваяЕдиница = единицы.ТекущийЭлемент ();
спр.Записать ();
 
всем спасибо!! завтра приду на работу - попробую :( отпишусь
 
vbs
большое спасибо!!! заработало :welcome:
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab