Вход | Регистрация


1С:Предприятие ::

Метки:

Работа с подчиненными справочниками

Я
   Wow__cooL
06.03.04 - 18:23
Пишу

Спр=СоздатьОбъект("Справочник.Номенклатура");
СпрЦен=СоздатьОбъект("Справочник.Цены");
Пока Файл.ВКонце()=0 Цикл 
  Если Спр.НайтиПоКоду(Файл._Code,0)=1 Тогда
       Спр.Удалить(1);
    Продолжить;
  КонецЕсли;
  Спр.Новый();       
  Спр.Код=Файл._Code;
  Спр.Наименование=Файл._Name; 
  Спр.ПолнНаименование=Файл._Name;
  Спр.ВидНоменклатуры="Товары"; 
  Спр.Записать();   
  НаимТовара=Спр.Наименование;
  СпрЦен.ИспользоватьВладельца(НаимТовара);
  СпрЦен.Новый(); 
  СпрЦен.ТипЦен="Основная";
  СпрЦен.Цена=Файл._Price;       
  СпрЦен.Записать();
  Файл.Следующая();//переходим на следующую запись

КонецЦикла;                                   
Файл.ЗакрытьФайл();

Выдает

СпрЦен.Записать();
{Обработка.ЗаписьФайла.Форма.Модуль(41)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!

Как надо правильно написать? Я уже запуталась...
 
  Рекламное место пустует
   afk
1 - 06.03.04 - 18:28
СпрЦен.ИспользоватьВладельца(Спр.ТекущийЭлемент());
   skunk
 
2 - 06.03.04 - 18:38
вместо
НаимТовара=Спр.Наименование; 
СпрЦен.ИспользоватьВладельца(НаимТовара);

надо
СпрЦен.ИспользоватьВладельца(Спр.ТекущийЭлемент());
   Wow__cooL
3 - 06.03.04 - 18:39
(1) не работает
   Wow__cooL
4 - 06.03.04 - 18:40
(1)(2) сейчас кто-нибудь третий зайдет и еще раз это же напишет, вроде как Бог троицу любит...
   Мимо Проходил
 
5 - 06.03.04 - 18:47
Цена - периодическая.
   afk
6 - 06.03.04 - 18:50
сообщение какое?
   327
7 - 06.03.04 - 18:53
Бред сивой кобылы .... в ясную лунную ночь ....

Хотя такая конструкция будет работать... последствия будут .... ну скажем так.... ХХХХХХХХХХХХ

А теперь об ошибках... Это ошибки мышления... скажем так - непонимание структуры базы.... и выполняемых действий, отсутсвия опыта работы ....

Первая ГРУБЕЙШАЯ ошибка (за нее обычно увольняют... слишком жестокие последствия).....

Если Спр.НайтиПоКоду(Файл._Code,0)=1 Тогда 
      Спр.Удалить(1); 
   Продолжить; 
КонецЕсли; 

Работать будет... НО - СПРАВОЧНИК Спр - справочник номенклатуры.... если эта позиция уже забита где либо в документ ... то оператор
       Спр.Удалить(1);
молча удалит элемент... и во всех документах при их открытии будет светиться радостное сообщение
"ОБЪЕКТ НЕ НАЙДЕН".....  После чего программисту остается только повеситься....

Создание нового элемента с тем же кодом ситуации не изменит - с точки зрения данных это НОВЫЙ элемент...

Так что надо искать по коду и позиционироваться на найденный объект.... или создавать новый, если код не найден...

Отсюда - маленькое замечание.... А если в загружаемом прайсе этот код стоит у другого товара - тогда будет маленькая за... пардон, засада, - товар один, а цена от другого ....

Далее....

Цена практически во всех типовых - периодический реквизит.... Если конфа своя и цена не периодическая... тогда прокатит..

Реквизит ТипЦен в типовых - это не текстовый реквизит.... а справочник ТипыЦен... если конфа своя, то это глупость - делать этот реквизит строкой ....

А вообще судя по стилю написания нет понимания разницы между наименованием элемента и самим элементом ...
   afk
7 - 06.03.04 - 18:53
ВидНоменклатуры, ТипЦены тоже наверное не строковые... но ведь не ругается! хе-хе-хе...
   Wow__cooL
9 - 06.03.04 - 18:53
(5) уже добавила 
СпрЦен.ИспользоватьДату(ТекущаяДата());
все равно не работает

(6)все то же
СпрЦен.Записать();
{Обработка.ЗаписьФайла.Форма.Модуль(41)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!
   afk
10 - 06.03.04 - 18:56
(7) может быть первоначальное заполнение справочника... когда можно и похерить через Удалить(1)
(9) снова код запости
 
  Рекламное место пустует
   Wow__cooL
11 - 06.03.04 - 19:02
(7) по поводу удаления - я абсолютно точно знаю, что эти элементы нигде не используются, а удаляю их затем, что первоначально они у меня были раскиданы по всем группам, а сейчас мне уже не важно, где они находятся (кто у них родитель). Так что вешаться я не собираюсь, и применяю я этот код дома, а на работе - естессно, не буду, знаю, что могу удалить что-то не то, дома это не страшно (тем более в текущей ситуации).

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

А вообще вместо разбора ошибок лучше выслушать правильное решение...
   327
12 - 06.03.04 - 19:04
(10) написание кривого кода только для загрузки - это клиника... также будет писаться код и для постоянной работы ....
   Wow__cooL
13 - 06.03.04 - 19:13
После выполнения данного кода
Спр.Новый();      
Спр.Код=Файл._Code;
Спр.Наименование=Файл._Name;  //=товар1 (для примера)

Спр.ПолнНаименование=Файл._Name;
Спр.Записать();   

в результате выполнения СОобщить(Спр.ТекущийЭлемент().Наименование) какое значение вернется?
После выполнения данного
   Wow__cooL
14 - 06.03.04 - 19:14
(12) не претендую на звание профессионала 1С в ближайшем будущем точно, прекрасно понимаю, что код можно написать гораздо более удобно, но сейчас это не является моей целью
   afk
15 - 06.03.04 - 19:15
(11) хе-хе-хе-хе!! ну откуда ты знаешь - что лучше!! самое лучшее для тебя - и твоих навыков - не задавать вопросов на форуме!! а разбираться, смотреть примеры использования и получать ОПЫТ а не готовые решения

(12) да _в этом_ код правильный ... иногда и Удалить(1) к месту
   Wow__cooL
16 - 06.03.04 - 19:19
(15) просто я уже устала... смотрела и в учебнике Волшебника, и в описании встроенного языка 1С, там тоже самое написано. Посмотрела еще в одной обработке - там подобное вроде, вот часть кода и использовала, но тем не менее он не работает.

Если бы я посидела 5 минут, и спрашивала - то да, согласна с тобой. Но здесь прошло уже не 5 минут.
   Wow__cooL
17 - 06.03.04 - 19:21
(10)
Спр=СоздатьОбъект("Справочник.Номенклатура");
СпрЦен=СоздатьОбъект("Справочник.Цены"); 
СпрВиды=СоздатьОбъект("Справочник.ВидыНоменклатуры");
Пока Файл.ВКонце()=0 Цикл 
    Если Спр.НайтиПоКоду(Файл._Code,0)=1 Тогда
        Спр.Удалить(1);
        Продолжить;
    КонецЕсли;
    Спр.Новый();       
    Спр.Код=Файл._Code;
    Спр.Наименование=Файл._Name; 
    Спр.ПолнНаименование=Файл._Name; 
    СпрВиды.НайтиПоНаименованию("Товары,0");
    Спр.ВидНоменклатуры=СпрВиды.Наименование;
    Спр.Записать();   
    СпрЦен.Новый();         
    
    СпрЦен.ИспользоватьВладельца(Спр.ТекущийЭлемент());
        СпрЦен.ИспользоватьДату(ТекущаяДата());
    СпрЦен.ТипЦен="Основная";
    СпрЦен.Цена=Файл._Price;       
    СпрЦен.Записать();
    Файл.Следующая();        
КонецЦикла;
   afk
18 - 06.03.04 - 19:21
(13) код полностью как в (0)
   skunk
 
19 - 06.03.04 - 19:22
СпрЦен.Новый(); поставить после СпрЦен.ИспользоватьДату(ТекущаяДата());
   Wow__cooL
20 - 06.03.04 - 19:23
+(17) перепутала СпрВиды.НайтиПоНаименованию("Товары",0);
   afk
21 - 06.03.04 - 19:23
сначала
СпрЦен.ИспользоватьВладельца(Спр.ТекущийЭлемент());

потом
СпрЦен.Новый();
   Wow__cooL
22 - 06.03.04 - 19:25
(19) (21) объединяя ваше, получится так?
СпрЦен.ИспользоватьВладельца(Спр.ТекущийЭлемент()); 
СпрЦен.ИспользоватьДату(ТекущаяДата());
СпрЦен.Новый();
   skunk
 
23 - 06.03.04 - 19:28
справочник код не ставиться автоматом, может это как-то...
   skunk
 
24 - 06.03.04 - 19:28
+23 вместо "справочник" читать "справочник Цены"
   Wow__cooL
25 - 06.03.04 - 19:32
так, цена занеслась, но возникает еще один вопрос: каким образом записать ВидНоменклатуры (тип - Справочник.ВидыНоменклатуры)? Это тоже очень надо, иначе в документ указанные товары записываться не будут, поскольку их вид не "Товары"
   skunk
 
26 - 06.03.04 - 19:34
Спр.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Прочее;

если всегда Товар (ТМЦ)
   Wow__cooL
27 - 06.03.04 - 19:47
(26) не работает, еще раньше это пробовала.
   Wow__cooL
28 - 06.03.04 - 19:49
+27 то есть ТипыНоменклатуры, кажется пробовала. а такого перечисления (ВидыНоменклатуры) в конфигурации нет
   skunk
 
29 - 06.03.04 - 19:51
ТиС стандартная или как - ????

что выдает при СпрВиды=СоздатьОбъект("Справочник.ВидыНоменклатуры"); - ???

какой тип значения у Реквизита ВидНоменклатуры в справочнике Номенклатуры
   Wow__cooL
30 - 06.03.04 - 19:57
(29) не ТиС, Бухгалтерия
с этим разобралась, написала
СпрВиды=СоздатьОбъект("Справочник.ВидыНоменклатуры");
СпрВиды.НайтиПоНаименованию("Товары",0);
Спр.ВидНоменклатуры=СпрВиды.ТекущийЭлемент();
все прекрасно работает.
скоро еще один вопрос задам.

всем спасибо за помощь!
   GrayT
 
31 - 06.03.04 - 20:02
(30)А если пользователь переименует "Товары"?
   327
32 - 06.03.04 - 20:15
Отходил..... Дела-с

Вот пример создания и записи подчиненного справочника
При первом проходе - создаем цены на 01.01.04
При втором проходе - добавляем цену на 11.01.04
Пример использования объекта Периодический

    Спр=СоздатьОбъект("Справочник.Номенклатура"); 
    СпрЦен=СоздатьОбъект("Справочник.Цены"); 
    НужнаяДата = Дата ('01.01.2004'); 
    НужнаяДата1 = Дата ('11.01.2004');
    Периодика = CreateObject("Periodic");
    
for Индекс = 1 to 3 do
       
    Код = "А"+string(Индекс); // тип кода - строковый

        
    if  Спр.FindByCode(Код,0) <> 1 then  
        Спр.New();      
        Спр.Description = "Название "+string(Индекс); 
        Спр.Code         = Код; 
        Спр.Write();   
    else
       // тут можно вставить изменение реквизитов номенклатуры

    КонецЕсли;                               
        
        
   // теперь клепаем подчиненный справочник


    for Инд = 1 to 3 do 
        СпрЦен.UseOwner(Спр.CurrentItem());                             
            
        if СпрЦен.FindByDescr("Какое то название "+string(Инд),1,1) <> 1 then
           // новый элемент

            СпрЦен.UseDate(НужнаяДата);
            СпрЦен.New();
            СпрЦен.Description        ="Какое то название "+string(Инд);      
            СпрЦен.Цена = Инд;
            СпрЦен.Write(); 
        else
           // найден - допишем периодику на новую дату

            Периодика.UseObject("Цена",СпрЦен);
            Периодика.ДатаЗнач = НужнаяДата1; 
            Периодика.Значение = Инд; 
            Периодика.Write();
                
        endIf; 
    endDo;

КонецЦикла;
   327
33 - 06.03.04 - 20:42
Ну и еще несколько советов по написанию обработок

Например, обработок по загрузке справочника из внешнего файла

На примере номенклатуры
На форму обработки кладутся
  тз - в нее сначала при выборе файла заносятся данные из файла и юзер грузит номенклатуру не вслепую, а визуально контролируя, что грузит.... Кнопочка - УдалитьСтроку - для удаления ненужных строк, ну и там несколько кнопочек типа ИзменитьНазвание, изменитьЦену и т.д.  Собственно загрузка выполняется по нажатию кнопки Загрузить....

   Те реквизиты, которые в файле отсутствуют, и которые нужно заполнить - заполняются следующим образом (в (31) вопрос хороший  --"А если пользователь переименует "Товары"?")
на форму обработки кладутся реквизиты с нужным типом .... При запуске загрузки делается проверка типа
Если ВидНоменклатуры.Выбран () <> 1 тогда
Предупреждение ("Последнее китайское предупреждение... Потом - докладная начальнику")
возврат;
КонецЕсли;

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

Таким образом нет проблемы с переименованием элементов... поиском по названию и т.д.

Но есть еще один маленький секрет, как сделать обработку очень удобной

В процедуре ПриОткрытии пишешь
ВидНоменклатуры = ВосстановитьЗначение(ЧтоТамНадоВосстановить.....)
СтавкаНДС= ВосстановитьЗначение(ЧтоТамНадоВосстановить.....)
.........................

В процедуре записи пишешь
СохранитьЗначение(параметры)
СохранитьЗначение(параметры)
СохранитьЗначение(параметры)
...........................

Таким образом, во второй раз и последующие обработка будет открываться с уже заполненными значениями с предыдущего запуска .....
И последний штрих.... если файл выбирается.... надо запоминать путь к нему и при следующих открытиях пытаться СРАЗУ предложить выбрать файлы по этому пути... Юзвери привыкают складывать файлы по определенному пути и с таким механизмом - горя не знают.... И делают меньше ошибок ....
 
 
   skunk
 
34 - 06.03.04 - 21:25
- сколько раз тебе говрить не ложи яйца на серебреный поднос они от этого темнеют!
- воистину. век живи - век учись. - подумал порудчик, и переложил серебреный подсигар из кармана брюк в нагрудный.

(33)фэнкс за советы
   GrayT
 
35 - 06.03.04 - 21:32
Побольше бы таких советов. Это уже не просто программирование - команды в книжках описанны. Это методология программирования. Спасибо.



Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует