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

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Рах, 29 июл 2009.

  1. TopicStarter Overlay
    Рах
    Offline

    Рах

    Регистрация:
    29 июл 2009
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Проблема заключается в следующем: Еденица измерения которая берется из выбранной номенклатуры не отображается, но когда выбираешь номенклатуру то всё нормально. Как создать правильный код во внешней обработке чтобы строки автоматом перебирались и Ед. присваиавлась? Вот я накуралесил, не работает:

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТекущийДокумент",СсылкаНаОбъект);
    Запрос.Текст ="ВЫБРАТЬ
    | ИнвентаризацияТоваровНаСкладе.Ссылка,
    | ИнвентаризацияТоваровНаСкладе.Номер,
    | ИнвентаризацияТоваровНаСкладе.Дата,
    | ИнвентаризацияТоваровНаСкладе.Проведен,
    | ИнвентаризацияТоваровНаСкладе.Организация,
    | ИнвентаризацияТоваровНаСкладе.Комментарий,
    | ИнвентаризацияТоваровНаСкладе.Склад,
    | ИнвентаризацияТоваровНаСкладе.Ответственный,
    | ИнвентаризацияТоваровНаСкладе.УсловияПроведенияИнвентаризации,
    | ИнвентаризацияТоваровНаСкладе.Товары.(
    | Ссылка,
    | НомерСтроки,
    | ЕдиницаИзмеренияМест,
    | Качество,
    | Количество,
    | КоличествоМест,
    | КоличествоУчет,
    | Коэффициент,
    | Номенклатура,
    | Сумма,
    | СуммаУчет,
    | ХарактеристикаНоменклатуры,
    | Цена,
    | ЦенаВРознице,
    | СуммаРегл,
    | ЕдиницаИзмерения,
    | СерияНоменклатуры
    | )
    |ИЗ
    | Документ.ИнвентаризацияТоваровНаСкладе КАК ИнвентаризацияТоваровНаСкладе";

    Шапка = Запрос.Выполнить().Выбрать();
    Шапка.Следующий();
    Сообщить(Шапка.Номер);
    ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
    Пока ВыборкаСтрокТовары.Следующий() Цикл
    Сообщить("Таблица = "+ВыборкаСтрокТовары.НомерСтроки);
    ДТ = Документы.ИнвентаризацияТоваровНаСкладе.НайтиПоНомеру(Шапка.Номер).Товары;
    ВыборкаСтрокТовары.Номенклатура = ВыборкаСтрокТовары.Номенклатура;
    КонецЦикла;

    Помогите пожалуйста разрулить неопытному.

    Вложения:

  2. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    А что это?
    Код:
    ВыборкаСтрокТовары.Номенклатура = ВыборкаСтрокТовары.Номенклатура;
    
  3. TopicStarter Overlay
    Рах
    Offline

    Рах

    Регистрация:
    29 июл 2009
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    ВыборкаСтрокТовары.Номенклатура = ВыборкаСтрокТовары.Номенклатура;

    Это ошибка. Которую нужно исправить. Както надо сделать так, чтобы Еденица измерения из номенклатуры вставала на место.
  4. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Выходит, что у Вас инвентаризация заполняется из инвентаризации?

    На основании что ли?
  5. TopicStarter Overlay
    Рах
    Offline

    Рах

    Регистрация:
    29 июл 2009
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    я хотел перевыбрать таким образом данные в строке. Данные строки присвоить эти же данные, по тому что когда выбераешь номенклатуру заново, единица измерения появляется. А исходный документ с незаполненной ед. изм.
  6. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Давайте запрос первичного заполнения документа. Этот не нужен.
  7. TopicStarter Overlay
    Рах
    Offline

    Рах

    Регистрация:
    29 июл 2009
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Попробую объяснить ещё разок. Исходный документ с заполненной таблицей но без ед.измерения, а вот если перевыбрать номенклатуру, то единица ее появляется, значит если перебрать все строки по одной и к каждой по по новой присвоить в поле номенклатуры уже имеющееся значение, то ед.изм. появится. От сюда следует что внешний запрос с этим справится. Как написать запрос выполняющий данную функцию перебора строк и перезапись значений номенклатуры в кажлой.
  8. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    А вы посмотрите, что происходит, когда Вы выбираете номенклатуру повторно. На поле Номенклатура скорее всего навесили процедурку ПриИзменении(). Вот оттуда и возьмите запрос.

    А обход строк табличной части документа делается так:
    Код:
    Для каждого тчСтрока Из Товары Цикл
    тчСтрока.Номенклатура = ...
    ...
    КонецЦикла;
    
    .. а не в выборке.
  9. TopicStarter Overlay
    Рах
    Offline

    Рах

    Регистрация:
    29 июл 2009
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Не понятно, что выбирать после точки?
    и вообще что потом.?
    подскажите.

    Товары = Документы.ИнвентаризацияТоваровНаСкладе.НайтиПоНомеру().Товары

    а может так, а потом что?

    Вложения:

    • 1.jpg
      1.jpg
      Размер файла:
      43,9 КБ
      Просмотров:
      33
  10. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Во-первых, посмотрите-таки процедуру НоменклатураПриИзменении() в модуле формы документа.

    Во-вторых, если влом смотреть, то:
    Код:
    Для каждого тчСтрока Из Товары Цикл
    тчСтрока.ЕдиницаИзмерения = тчСтрока.Номенклатура.ЕдиницаИзмерения;
    КонецЦикла;
    
    Это все. Три строки. Вам лень просто анализировать.
  11. TopicStarter Overlay
    Рах
    Offline

    Рах

    Регистрация:
    29 июл 2009
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Это из обработке при изменении.
    СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;

    СтароеЗначениеКоэффициента = СтрокаТабличнойЧасти.Коэффициент;

    // Выполнить общие действия для всех документов при изменении Единица.
    ОбработкаТабличныхЧастей.ПриИзмененииЕдиницыТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);

    СтрокаТабличнойЧасти.КоличествоУчет = СтрокаТабличнойЧасти.КоличествоУчет * СтароеЗначениеКоэффициента
    / СтрокаТабличнойЧасти.Коэффициент;

    СтрокаТабличнойЧасти.Количество = СтрокаТабличнойЧасти.Количество * СтароеЗначениеКоэффициента
    / СтрокаТабличнойЧасти.Коэффициент;

    ---------------------------------
    А вот обработка которую я пишу. Почемуто ни чего не работает, второй цикл не идет

    Перем СсылкаНаОбъект Экспорт;

    Процедура Исправление() Экспорт;

    ДокВыборки = Документы.ИнвентаризацияТоваровНаСкладе.Выбрать();
    Пока ДокВыборки.Следующий() Цикл
    Товары = Документы.ИнвентаризацияТоваровНаСкладе.НайтиПоНомеру(ДокВыборки.Номер).Товары;
    Сообщить("Номер "+ДокВыборки.Номер);

    Для каждого тчСтрока Из Товары Цикл
    Сообщить(тчСтрока.НомерСтроки);
    ОбработкаТабличныхЧастей.ПриИзмененииЕдиницыТабЧасти(тчСтрока, СсылкаНаОбъект);
    КонецЦикла;
    КонецЦикла;
    КонецПроцедуры;
  12. TopicStarter Overlay
    Рах
    Offline

    Рах

    Регистрация:
    29 июл 2009
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Перем СсылкаНаОбъект Экспорт;

    Процедура Исправление() Экспорт;

    ДокВыборки = Документы.ИнвентаризацияТоваровНаСкладе.Выбрать();
    Пока ДокВыборки.Следующий() Цикл
    Сообщить("Номер "+ДокВыборки.Номер);
    Товары = ДокВыборки.Товары;
    Для каждого тчСтрока Из Товары Цикл
    Сообщить(тчСтрока.НомерСтроки);
    ОбработкаТабличныхЧастей.ПриИзмененииЕдиницыТабЧасти(тчСтрока, ДокВыборки);
    КонецЦикла;
    КонецЦикла;
    КонецПроцедуры;

    Вот так цикл пошел. но выдает ошибку: Метод объекта не обнаружен (Метаданные)
  13. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Давайте разберем:
    Код:
    Перем СсылкаНаОбъект Экспорт;
    
    Где Вы объявляете эту переменную? Зачем ей присваиваете Экспорт?

    Код:
    Процедура Исправление() Экспорт;
    
    Аналогичный вопрос.

    Код:
    ДокВыборки = Документы.ИнвентаризацияТоваровНаСкладе.Выбрать();
    Пока ДокВыборки.Следующий() Цикл
    
    Тут Вы выбираете ВСЕ документы из своей базы. Это верно?

    Код:
    Товары = Документы.ИнвентаризацияТоваровНаСкладе.НайтиПоНомеру(ДокВыборки.Номер).Товары;
    
    Зачем еще раз искать документ по номеру, когда вы его получаете в выборке? Это раз.
    Два. Для изменения документа надо получить Документ-объект.
    Три. А проверку на непроведенные или помеченные на удаление документы не надо разве делать?

    Код:
    Сообщить("Номер "+ДокВыборки.Номер);
    
    Для каждого тчСтрока Из Товары Цикл
    
    Ну, ок. Получили тч...
    Код:
    Сообщить(тчСтрока.НомерСтроки);
    ОбработкаТабличныхЧастей.ПриИзмененииЕдиницыТабЧасти(тчСтрока, СсылкаНаОбъект);
    КонецЦикла;
    КонецЦикла;
    КонецПроцедуры;
    
    А что Вы здесь обрабатывать собираетесь?

    Итог.
    Я Вам дал код. Достаточно сделать следующее.
    Определиться с тем, что и где Вам нужно.
    Написать обработку табличной части документа.
    В нее вставить процедуру Инициализировать(Объект,а,б) Экспорт.
    В процедуру вставить мой код, немного его изменив для обработки.
    Отмечу. Это в том случае, если Вам нужно всего лишь заполнить единицу измерения.

    Нет полноценной постановки задачи.
  14. TopicStarter Overlay
    Рах
    Offline

    Рах

    Регистрация:
    29 июл 2009
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Внешняя обработка для исправления ед.изм..

    Процедура Исправление() Экспорт; //Эта процедура вызывается из формы по нажатию на кнопочку

    ДокВыборки = Документы.ИнвентаризацияТоваровНаСкладе.Выбрать();
    Пока ДокВыборки.Следующий() Цикл
    Сообщить("Номер "+ДокВыборки.Номер);
    Товары = ДокВыборки.Товары;
    Для каждого тчСтрока Из Товары Цикл
    Сообщить(тчСтрока.НомерСтроки);
    тчСтрока.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт");
    КонецЦикла;
    КонецЦикла;
    КонецПроцедуры;

    Ошибка:
    Поле объекта недоступно для записи (ЕденицаИзмерения)

    {ВнешняяОбработка.Инвентаризация(11)}: Поле объекта недоступно для записи (ЕдиницаИзмерения)
    тчСтрока.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт");


    Подскажите тогда как создать документ - объект? Или что мне делать? Пожалуйста
  15. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Повторю.
    Для изменения документа надо получить объект.

    После
    Код:
    ..Сообщить("Номер "+ДокВыборки.Номер);
    
    надо вставить
    Код:
    обДок = ДокВыборки.ПолучитьОбъект();
    
    И потом писать:
    Код:
    Товары = обДок .Товары;
    
    А в конце обработки все тч сделать
    Код:
    обДок.Записать();
    
    Ну следует учесть, что документ перепроведется.
  16. TopicStarter Overlay
    Рах
    Offline

    Рах

    Регистрация:
    29 июл 2009
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Огромное спасибо. Все работает!

    Процедура Исправление() Экспорт;
    ДокВыборки = Документы.ИнвентаризацияТоваровНаСкладе.Выбрать();
    Пока ДокВыборки.Следующий() Цикл
    Сообщить("Номер "+ДокВыборки.Номер);
    ОбДок = ДокВыборки.ПолучитьОбъект();
    Товары = ОбДок.Товары;
    Для каждого тчСтрока Из Товары Цикл
    Сообщить(тчСтрока.НомерСтроки);
    тчСтрока.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт");
    КонецЦикла;
    ОбДок.Записать();
    КонецЦикла;
    КонецПроцедуры;
  17. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    :unsure:

    Правильная постановка вопроса в разы уменьшает время получения адекватного ответа.
    Успехов. Советую подзакупиться литературой по разработке. Габец, например, "Простые примеры разработки", или еще круче мегатом "Профессиональная разработка в системе 1С:Предприятие 8.0". Для начала сойдет.

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