8.х Изменение Единицы Хранения

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем djyarilo, 18 апр 2011.

  1. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    1 С 8.2 Конфигурация - Комплексная автоматизация.

    Задача сделующая, нужно написать обработку которая будет изменять ЕдиницуХраненияОстатков, изменяться будет на то, что указано в БазовойЕдиницыХранения в справочнике Номенклатура. ЕдиницуХраненияОстатков имеет ссылку на справочник единицы измерения, справочник подчинен Номенклатуре. БазоваяединицаИзмерения так же имеет ссылку и подчинена. Сначало долго парился как сделать так чтобы хотя бы записывал данные в итоге были ошибки типо Объект защищен от записи использовал ПОлучитьОбъект и пришел к тому что в единицуХранения ни чего не записывает((((((

    Код:
    СпрЯс =  Справочники.Номенклатура.ВыбратьИерархически();
    ВыборкаЕдиниц = Справочники.ЕдиницыИзмерения.Выбрать(,СпрЯс.Владелец);
    Владелец = Спряс.Владелец;
    Пока СпрЯс.Следующий() цикл
    Если СпрЯс.ЭтоГруппа  = 0 тогда
    
    Пока ВыборкаЕдиниц.Следующий() цикл
    Если ВыборкаЕдиниц.Наименование = СпрЯс.БазоваяЕдиницаИзмерения Тогда
    НайденнаяЕдиница = СпрЯс.БазоваяЕдиницаИзмерения;
    сообщить("на единицу: "+НайденнаяЕдиница+ " базовая единица " + СпрЯс.БазоваяЕдиницаИзмерения +"   Владелец по номенклатуре:  "+ВыборкаЕдиниц.Владелец  );
    
    Иначе
    НайденнаяЕдиницаОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    НайденнаяЕдиницаОбъект.Наименование            = СпрЯс.БазоваяЕдиницаИзмерения.Наименование;
    НайденнаяЕдиницаОбъект.ЕдиницаПоКлассификатору = СпрЯс.БазоваяЕдиницаИзмерения;
    НайденнаяЕдиницаОбъект.Коэффициент             = 1;
    //	НайденнаяЕдиницаОбъект.ЕдиницаИзмеренияНоменклатуры = (ТипЗнч(Объект.Владелец) = Тип("СправочникСсылка.Номенклатура"));
    
    НайденнаяЕдиницаОбъект.Владелец                = ВыборкаЕдиниц.Владелец;
    НайденнаяЕдиницаОбъект.Записать();
    НайденнаяЕдиница = НайденнаяЕдиницаОбъект.Наименование;
    
    СпрОбъект = СпрЯс.ПолучитьОбъект();
    СпрОбъект.ЕдиницаХраненияОстатков = НайденнаяЕдиница;
    СпрОбъект.Записать();
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/сообщить')">		Сообщить(" найденная единица " +НайденнаяЕдиница + " единица " + СпрОбъект.ЕдиницаХраненияОстатков) ;      	</span>
    
    //	сообщить("на единицу: "+НайденнаяЕдиница+ " базовая единица " + СпрЯс.БазоваяЕдиницаИзмерения +"   Владелец по номенклатуре:  "+ВыборкаЕдиниц.Владелец  );
    конецесли;
    
    КонецЦикла;		
    конецесли;
    
    КонецЦикла;
    
    Вот код в чем могут быть приичны?

    {Форма.Форма.Форма(27)}: Ошибка при вызове метода контекста (Записать)
    СпрОбъект.Записать();
    по причине:

    по причине:
    Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
    Вот такая ошибка
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Все не так.

    "ВыборкаЕдиниц" - вы получаете перед циклом, а потом запускаете цикл по номенклатуре. Кто в итоге будет владельцем? Кроме того:
    Код:
    ВыборкаЕдиниц = Справочники.ЕдиницыИзмерения.Выбрать(,СпрЯс.Владелец);
    
    
    СпрЯс.Владелец - чему у вас равно будет? вы на этот момент еще выборку не начали. Почему вообще Владелец элемента Номенклатура? Номенклатура - не подчиненый справочник. Ссылка, а не Владелец + см. выше то, что я по этой строке написал.



    Код:
    Если СпрЯс.ЭтоГруппа  = 0 тогда
    
    
    =0 - лишнее, просто "СпрЯс.ЭтоГруппа".



    Код:
    НайденнаяЕдиница = НайденнаяЕдиницаОбъект.Наименование;
    
    СпрОбъект = СпрЯс.ПолучитьОбъект();
    СпрОбъект.ЕдиницаХраненияОстатков = НайденнаяЕдиница;
    СпрОбъект.Записать();
    
    
    НайденнаяЕдиница - у вас будет строка, а "СпрОбъект.ЕдиницаХраненияОстатков" - должна быть СправочникСсылка.
  3. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    Я не правильно наверно выразился, в данном случае я использовал СпрЯс.Владелец, потому что мне нужно не конкретно 1 номенклатуру, а нужно во всех номенклатурах изменить Единицы.

    А номенклатура по сути является владельцем единицы хранения!
    получается чтобы изменить единицу хранения, мне по номенклатуре нужно открывать подчиненный справочник, в нем сравнивать есть ли в Единице такая же как в Справочнике.Номенклатура. Базовая, еесли есть то оставить ту же. если нет то добавить новую. И вот при добавление я вообще не могу понять как установить Ссылку на справочник в котором надо изменять объект. Попробовал так не вышло.
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Именно.
    Для чего же пытаться получить владельца элемента Номенклатуры? У Номенклатуры - нет владельца.
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Как-то так (не проверял):
    Код:
    	СправочникНоменклатура = Справочники.Номенклатура.Выбрать();
    
    Пока СправочникНоменклатура.Следующий() Цикл
    ОбработкаПрерыванияПользователя();
    
    Если СправочникНоменклатура.ЭтоГруппа Тогда
    Продолжить;
    КонецЕсли;
    
    НайденнаяЕдиница = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
    ЕдиницыИзмерения = Справочники.ЕдиницыИзмерения.Выбрать(, СправочникНоменклатура.Ссылка);
    Пока ЕдиницыИзмерения.Следующий() Цикл
    Если ЕдиницыИзмерения.Наименование = СправочникНоменклатура.БазоваяЕдиницаИзмерения.Наименование Тогда
    НайденнаяЕдиница = ЕдиницыИзмерения.Ссылка;
    Сообщить("На единицу: " + НайденнаяЕдиница + " базовая единица " + СправочникНоменклатура.БазоваяЕдиницаИзмерения + "   Владелец по номенклатуре:  " + ЕдиницыИзмерения.Владелец);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    Если НайденнаяЕдиница.Пустая() Тогда
    Попытка
    НайденнаяЕдиница = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    НайденнаяЕдиница.Наименование = СправочникНоменклатура.БазоваяЕдиницаИзмерения.Наименование;
    НайденнаяЕдиница.ЕдиницаПоКлассификатору = СправочникНоменклатура.БазоваяЕдиницаИзмерения;
    НайденнаяЕдиница.Коэффициент             = 1;
    НайденнаяЕдиница.Владелец                = СправочникНоменклатура.Ссылка;
    НайденнаяЕдиница.Записать();
    Исключение
    Сообщить(ОписаниеОшибки());
    Продолжить();
    КонецПопытки;
    
    НайденнаяЕдиница = НайденнаяЕдиница.Ссылка;
    КонецЕсли;
    
    
    СпрОбъект = СправочникНоменклатура.ПолучитьОбъект();
    СпрОбъект.ЕдиницаХраненияОстатков = НайденнаяЕдиница;
    СпрОбъект.Записать();
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/сообщить')">		Сообщить(" найденная единица " +НайденнаяЕдиница + " единица " + СпрОбъект.ЕдиницаХраненияОстатков);      	</span>
    
    КонецЦикла;
    
    
    
  6. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Да, чет написал. не подумал.
    Документы перепровести надо будет. Все.
  7. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    Там не документы а регистры, но это я знаю как)) надеюсь.

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