как проверить, есть ли в справочнике элементы

Тема в разделе "1C и всё что с ней связано", создана пользователем Nastyusha, 26 авг 2010.

  1. Nastyusha

    Nastyusha Гость

    Добрый день
    1с 7.7
    Есть подчиненный справочник (Упаковка подчинен спр. номенклатура) . Он пустой и раньше не использовался

    как программно проверить пустой ли справочник. и как программно его заполнить (находясь в модуле документа)?
    (из модуля документа вызываю процедуру), но не работает
    СпрУпаковка= СоздатьОбъект("Справочник.Упаковки");
    СпрУпаковка.ИспользоватьВладельца(наименованиеЭтикетки); //наименованиеЭтикетки тип спр. номенклатура
    СпрУпаковка.ВыбратьЭлементы(0);

    Если СпрУпаковка.ПолучитьЭлемент() = 0 Тогда
    Сообщить("Справочник+ "+СпрУпаковка+"пустной");
    СпрУпаковка.Новый();
    СпрУпаковка.Наименование = "Втулка (шт)";

    КонецЕсли;

    (нужно программно заполнить наименование, размер и расход)
    количество наименований=5
     
  2. simply1

    simply1 Гость

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

    СпрУпаковка.ИспользоватьВладельца(Владелец);
    И обязательно, в конце создания нового не забыть:
    Код (Text):
    СпрУпаковка.Записать();
    ;) Сам иногда забываю ...
     
  3. Nastyusha

    Nastyusha Гость

    Записать() было, просто не скопировала
    Не получается..
    Сообщение не появляется, записи в справочник не добавляются
     
  4. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Во первых ВыбратьЭлементы(0) - неправильно, поскольку подчинение - это и тоже иерархия, иначе получитьэлемент всегда будет равно 1 (если есть хоть один подчиненный элемент). Надо ВыбратьЭлементы(1)
    Во вторых, таки да - записать.
     
  5. simply1

    simply1 Гость

    Совершенно верно!
    "ВыбратьЭлементы(<Режим>)" я упустил ...

    Еще - при создании нового подчиненного элемента обязательно нужно указывать владелца:
    Код (Text):
    ...
    СпрУпаковка.Новый();
    ...
    СпрУпаковка.Владелец=Владелец;
    ...
    А то насоздавались элементы без владельца ...
     
  6. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    В случае если было ИспользоватьВладельца() - уже не надо.
     
  7. simply1

    simply1 Гость

    Век живи, век учись!

    А я, для надежности, всегда использую ;)
     
  8. Nastyusha

    Nastyusha Гость

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

    Если СпрУпаковка.ПолучитьЭлемент() = 0 Тогда
    Сообщить("Справочник+ "+СпрУпаковка+"пустной");
    СпрУпаковка.Новый();
    СпрУпаковка.Наименование = "Втулка";
    СпрУпаковка.Записать();
    КонецЕсли; //СпрУпаковка.ПолучитьЭлемент() = 0 Тогда

    но все равно ничего не происходит..
     
  9. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Ну будем ставить проверку на всё

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

    Если СпрУпаковка.ПолучитьЭлемент() = 0 Тогда
    Сообщить("Справочник+ "+СпрУпаковка+"пустой");
    СпрУпаковка.Новый();
    СпрУпаковка.Наименование = "Втулка";
    СпрУпаковка.Записать();
    КонецЕсли; //СпрУпаковка.ПолучитьЭлемент() = 0 Тогда
     
  10. TimeDontWait

    TimeDontWait Well-Known Member

    Регистрация:
    4 янв 2010
    Сообщения:
    383
    Симпатии:
    0
    Код (Text):
    спрупаковка.использоватьдату(дата)
     
  11. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    А нафига? Тут до выборки дело не доходит.
     
  12. TimeDontWait

    TimeDontWait Well-Known Member

    Регистрация:
    4 янв 2010
    Сообщения:
    383
    Симпатии:
    0
    Извиняюсь, недосмотрел.
    Может поменять владелец на другую переменную, все-таки это зарезервированное слово
     
  13. simply1

    simply1 Гость

    С логикой проверок - проблема.
    СпрУпаковка.ВыбратьЭлементы()=0 - нужно проверять, на случай отстутствия подчиненных.
    А если подчиненные есть, то нужно проверить необходимость создания нового (вдруг уже такой есть?).
     
  14. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0

    А вот это абсолютно верно! и гораздо лучше чем получитьЭлемент().
     
  15. Nastyusha

    Nastyusha Гость

    когда вызвала из другой процедуры такое сообщение:
    Не найден владелец (наименование этикетки) Тип Справочник
     
  16. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    С учетом вышесказанного и выпив кофию

    Ага - таки уже Элемент, тогда искать не надо.


    СпрУпаковка= СоздатьОбъект("Справочник.Упаковки");
    Если НаименованиеЭтикетки.Выбран() = 0 Тогда
    Сообщить("Не выбран Владелец!");
    Возврат;
    КонецЕСли;
    СпрУпаковка.ИспользоватьВладельца(НаименованиеЭтикетки);
    Если СпрУпаковка.ВыбратьЭлементы() = 0 Тогда
    Сообщить("Справочник+ "+СпрУпаковка+"пустой, заполняем");
    СпрУпаковка.Новый();
    СпрУпаковка.Наименование = "Втулка";
    СпрУпаковка.Записать();
    Иначе
    Сообщить("Существуют элементы");
    //Тут перезаполнение в цикле выборки если надо
    КонецЕсли; //Если НаименованиеЭтикетки.Выбран() = 0 Тогда
     
  17. TimeDontWait

    TimeDontWait Well-Known Member

    Регистрация:
    4 янв 2010
    Сообщения:
    383
    Симпатии:
    0
    Если СпрЭтикетки.НайтиПоНаименованию(строка(наименованиеЭтикетки),0,0)=1 Тогда
     
  18. Nastyusha

    Nastyusha Гость

    Спасибо, TimeDontWait,
    Создали объект
    Нашли владельца.
    Но справочник пока еще не заполняется

    Добавлено: извиняюсь, не заметила
    создался элемент справочника
    Спасибо всем огромное за помощь...
     
  19. TimeDontWait

    TimeDontWait Well-Known Member

    Регистрация:
    4 янв 2010
    Сообщения:
    383
    Симпатии:
    0
    Економичнее как выше написал puh14
     
  20. Nastyusha

    Nastyusha Гость

    еще раз большое спасибо, все получилось.
    Исправила, как посоветовал puh14
     
Загрузка...

Поделиться этой страницей