8.х Изменение реквизитов в документах

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

  1. TopicStarter Overlay
    new_programer
    Offline

    new_programer

    Регистрация:
    13 апр 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Есть автоматически сформированный отчёт, который всё правильно выводит.
    Другая задача состоит в том, чтобы изменить во всех документах значение
    количества на другое произвольное и это новое значение записать в тот же документ.
    Какой программный код надо написать в (***), чтобы не менять логику всей процедуры?

    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПоступлениеТоваровУслуг.Номер КАК Номер,
    |	ПоступлениеТоваровУслуг.Дата КАК Дата,
    |	ПоступлениеТоваровУслуг.Контрагент.Наименование КАК КонтрагентНаименование,
    |	ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование,
    |	ПоступлениеТоваровУслуг.Товары.(
    |		Номенклатура.Наименование,
    |		Количество,
    |		Цена,
    |		Сумма,
    |		СуммаНДС
    |	)
    |ИЗ
    |	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
    |ГДЕ
    |	ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование ПОДОБНО ""%договор комиссии%""
    |
    |УПОРЯДОЧИТЬ ПО
    |	Дата,
    |	КонтрагентНаименование";
    
    Результат = Запрос.Выполнить();
    ВыборкаДокум = Результат.Выбрать();
    
    Пока ВыборкаДокум.Следующий() Цикл
    
    ВыборкаТовары = ВыборкаДокум.Товары.Выбрать();
    Пока ВыборкаТовары.Следующий() Цикл
    
    // ***	
    
    КонецЦикла;
    
    КонецЦикла;
    
    Сообщить("Изменение количества выполнено.");
    
    КонецПроцедуры
    
  2. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Код:
    Результат = Запрос.Выполнить();
    ВыборкаДокум = Результат.Выбрать();
    
    Пока ВыборкаДокум.Следующий() Цикл
    
    Ссылка=ВыборкаДокум.Ссылка.ПолучитьОбъект();
    
    ВыборкаТовары = ВыборкаДокум.Товары.Выбрать();
    Пока ВыборкаТовары.Следующий() Цикл
    
    Ссылка.Товары.Количество=НовоеКоличество;				
    
    
    КонецЦикла;
    Ссылка.Записать();
    
    КонецЦикла;
    
    Сообщить("Изменение количества выполнено.");
    
    КонецПроцедуры
    
    
    Но это на вскидку, нужно проверять.
  3. TopicStarter Overlay
    new_programer
    Offline

    new_programer

    Регистрация:
    13 апр 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Выдаётся следующее сообщение:

    {Форма.Форма(31)}: Поле объекта не обнаружено (Ссылка)
    Ссылка = ВыборкаДокум.Ссылка.ПолучитьОбъект();
  4. AlexFF
    Offline

    AlexFF Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26
    В запрос строку добавить
    Код:
    | ПоступлениеТоваровУслуг.Ссылка
    
  5. TopicStarter Overlay
    new_programer
    Offline

    new_programer

    Регистрация:
    13 апр 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Добавил, теперь пишет это сообщение
    {Форма.Форма(33)}: Поле объекта не обнаружено (Количество)
    Ссылка.Товары.Количество = 555;

    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПоступлениеТоваровУслуг.Номер КАК Номер,
    |	ПоступлениеТоваровУслуг.Дата КАК Дата,
    |	ПоступлениеТоваровУслуг.Контрагент.Наименование КАК КонтрагентНаименование,
    |	ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование,
    [b]	|	ПоступлениеТоваровУслуг.Ссылка,[/b]	|	ПоступлениеТоваровУслуг.Товары.(
    |		Номенклатура.Наименование,
    |		Количество,
    |		Цена,
    |		Сумма,
    |		СуммаНДС
    |	)
    |ИЗ
    |	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
    |ГДЕ
    |	ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование ПОДОБНО ""%договор комиссии%""
    |
    |УПОРЯДОЧИТЬ ПО
    |	Дата,
    |	КонтрагентНаименование";
    
    Результат = Запрос.Выполнить();
    ВыборкаДокум = Результат.Выбрать();
    Пока ВыборкаДокум.Следующий() Цикл
    Ссылка = ВыборкаДокум.Ссылка.ПолучитьОбъект();
    ВыборкаТовары = ВыборкаДокум.Товары.Выбрать();
    Пока ВыборкаТовары.Следующий() Цикл
    Ссылка.Товары.Количество = 555;
    КонецЦикла;
    Ссылка.Записать();
    КонецЦикла;
    Сообщить("Изменение количества выполнено.");
    КонецПроцедуры
    
    
  6. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    Ссылка.Товары - это табличная часть документа. То есть нужно позиционироваться на строке табличной части и вней уже менять количество
  7. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Таким образом? Просто 1С нет под рукой чтоб проверить.
  8. TopicStarter Overlay
    new_programer
    Offline

    new_programer

    Регистрация:
    13 апр 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    А можно примерчик вместо этой строки
    Код:
    Ссылка.Товары.Количество = 555;
    
    
    За ранее благодарен.
  9. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Код:
    Пока ВыборкаТовары.Следующий() Цикл
    ВыборкаТовары.Количество = 555;
    КонецЦикла; 
    
  10. TopicStarter Overlay
    new_programer
    Offline

    new_programer

    Регистрация:
    13 апр 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Пишет такое сообщение:
    {Форма.Форма(31)}: Метод объекта не обнаружен (Выбрать)
    ВыборкаТовары = Ссылка.Товары.Выбрать();
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПоступлениеТоваровУслуг.Номер КАК Номер,
    |	ПоступлениеТоваровУслуг.Дата КАК Дата,
    |	ПоступлениеТоваровУслуг.Контрагент.Наименование КАК КонтрагентНаименование,
    |	ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование,
    |	ПоступлениеТоваровУслуг.Ссылка,
    |	ПоступлениеТоваровУслуг.Товары.(
    |		Номенклатура.Наименование,
    |		Количество,
    |		Цена,
    |		Сумма,
    |		СуммаНДС
    |	)
    |ИЗ
    |	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
    |ГДЕ
    |	ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование ПОДОБНО ""%договор комиссии%""
    |
    |УПОРЯДОЧИТЬ ПО
    |	Дата,
    |	КонтрагентНаименование";
    
    Результат = Запрос.Выполнить();
    ВыборкаДокум = Результат.Выбрать();
    Пока ВыборкаДокум.Следующий() Цикл
    Ссылка = ВыборкаДокум.Ссылка.ПолучитьОбъект();
    ВыборкаТовары = Ссылка.Товары.Выбрать();
    Пока ВыборкаТовары.Следующий() Цикл
    ВыборкаТовары.Количество = 555;
    КонецЦикла;
    Ссылка.Записать();
    КонецЦикла;
    Сообщить("Изменение количества выполнено.");
    КонецПроцедуры
    
    
  11. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Блин, под рукой нет 1С, но смысл такой, выборкой получаем объект(чтобы изменить его). Потом в цикле нужно перебрать табличную часть полученного объекта и изменить ее. Потом нужно записать объект.
  12. TopicStarter Overlay
    new_programer
    Offline

    new_programer

    Регистрация:
    13 апр 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    А если так записать ссылку, что изменится. Я имею в виду разницу между
    ПоступлениеТоваровУслуг.Ссылка и ПоступлениеТоваровУслуг.Товары.Ссылка
    Как правильно, получить ссылку на весь документ или на каждую запись товара?

    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	[b]ПоступлениеТоваровУслуг.Товары.Ссылка,[/b]
    |	ПоступлениеТоваровУслуг.Номер КАК Номер,
    |	ПоступлениеТоваровУслуг.Дата КАК Дата,
    |	ПоступлениеТоваровУслуг.Контрагент.Наименование КАК КонтрагентНаименование,
    |	ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование,
    |	ПоступлениеТоваровУслуг.Товары.(
    |		Номенклатура.Наименование,
    |		Количество,
    |		Цена,
    |		Сумма,
    |		СуммаНДС
    |	)
    |ИЗ
    |	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
    |ГДЕ
    |	ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование ПОДОБНО ""%договор комиссии%""
    |
    |УПОРЯДОЧИТЬ ПО
    |	Дата,
    |	КонтрагентНаименование";
    
    Результат = Запрос.Выполнить();
    ВыборкаДокум = Результат.Выбрать();
    Пока ВыборкаДокум.Следующий() Цикл
    ВыборкаТовары = ВыборкаДокум.Товары.Выбрать();
    Пока ВыборкаТовары.Следующий() Цикл
    Ссылка = ВыборкаТовары.Ссылка.ПолучитьОбъект();
    Ссылка.Товары.Количество = 555;
    КонецЦикла;
    Ссылка.Записать();
    КонецЦикла;
    Сообщить("Изменение количества выполнено.");
    КонецПроцедуры
    
    
    Выдаёт похожее сообщение:
    {Форма.Форма(32)}: Поле объекта не обнаружено (Количество)
    Ссылка.Товары.Количество = 555;
  13. AlexFF
    Offline

    AlexFF Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    ПоступлениеТоваровУслуг.Товары.Ссылка,
    |    ПоступлениеТоваровУслуг.Номер КАК Номер,
    |    ПоступлениеТоваровУслуг.Дата КАК Дата,
    |    ПоступлениеТоваровУслуг.Контрагент.Наименование КАК КонтрагентНаименование,
    |    ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование
    |ИЗ
    |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
    |ГДЕ
    |    ПоступлениеТоваровУслуг.ДоговорКонтрагента.Наименование ПОДОБНО ""%договор комиссии%""
    |
    |УПОРЯДОЧИТЬ ПО
    |    Дата,
    |    КонтрагентНаименование";
    
    Результат = Запрос.Выполнить();
    ВыборкаДокум = Результат.Выбрать();
    Пока ВыборкаДокум.Следующий() Цикл
    Объект = ВыборкаДокум.Ссылка.ПолучитьОбъект();
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    СтрокаТЧ.Количество = 555;
    КонецЦикла;
    Объект.Записать();
    КонецЦикла;
    Сообщить("Изменение количества выполнено.");
    КонецПроцедуры
    
    
    
  14. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Вот код:
    Код:
    Результат = Запрос.Выполнить();
    ВыборкаДетали = Результат.Выбрать();
    Пока ВыборкаДетали.Следующий() Цикл
    Ссылка = ВыборкаДетали.Ссылка.ПолучитьОбъект();
    Сообщить(Ссылка);
    СтаршийИндекс = Ссылка.Товары.Количество() - 1;
    Для Сч = 0 по СтаршийИндекс Цикл 
    Ссылка.Товары[Сч].Количество=1;
    КонецЦикла; 
    Ссылка.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);
    КонецЦикла;
    
  15. TopicStarter Overlay
    new_programer
    Offline

    new_programer

    Регистрация:
    13 апр 2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Работают два варианта.
    Большое спасибо за поддержку!!!
    Тему можно считать закрытой.

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