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


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 человек.
Рекламное место пустует