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

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

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

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

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

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

Спартак

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

KiR

даж не знаю что бы посоветовать.. пожалуй почитать ;)
По идее ведь выбираешь элемент из подчиненного справочника и присваиваешь это значение одному из реквизитов нужного элемента справочника
 
С

Спартак

если бы все было так просто...

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

вот это срабатывает без ошибок, но базовая единица не появляется ;)
 
K

KiR

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

Спартак

единица находится. а ед лежит ссылка на нее
 
A

Andruha

Если спр. Единицы подчинен спр. Номенклатура, тогда надо сначало записать элемент номеклатуры без единицы, а потом уже записать единицу - потому что владельца сначала надо записать, а потом уже подчиненный справочник дергать.
 
С

Спартак

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

та же самая фигня... базовой единицы нет :(
 
H

Hryv

1. У спр.БазоваяЕдиница тип точно "Справочник.ОКЕИ"?

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

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

vbs

Вот тебе пример :

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
// иначе надо найти наименование в справочнике ОКЕИ и потом использовать
//ед.НайтиПоРеквизиту("ОКЕИ")
спр.БазоваяЕдиница = ед.ТекущийЭлемент ();
спр.Записать ();
 
K

KiR

vbs, чисто так - для саморазвития... разве нельзя сразу найти ед.НайтиПоНаименованию("шт", 0) и передавать ссылку?
 
V

vbs

vbs, чисто так - для саморазвития... разве нельзя сразу найти ед.НайтиПоНаименованию("шт", 0) и передавать ссылку?
В справочнике "единицы" в ТиС обычно наименование и код равны 0

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

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

спр.БазоваяЕдиница = единицы.ТекущийЭлемент ();
спр.Записать ();
 
С

Спартак

всем спасибо!! завтра приду на работу - попробую :( отпишусь
 
С

Спартак

vbs
большое спасибо!!! заработало :welcome:
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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