Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
14 Дек 2017, 05:33
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Редактирование табличной части документа. Колонка количество.  (Прочитано 10395 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yuriy78

  • *
  • Сообщений: 10
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-07
  • Сайт: 
  • Профессия: Ученик 1С
У меня вот такая задача, получить план закупок в УПП с учетом количества аналогов номенклатуры на складе. Я написал обработку и застрял на том, что не могу изменить количество в табличной части документа для нужной мне номенклатуры. Выкладываю свою обработку и прошу подсказки и мнения опытных программистов 1С, т.к. сам не давно начал изучать язык 1С

Процедура КнопкаВыполнитьНажатие(Кнопка)

докПланЗакупок = ЭлементыФормы.ПланЗакупок.Значение;

Для Каждого ТекущаяСтрока Из докПланЗакупок.СоставПлана Цикл
НаимНом = ТекущаяСтрока.Номенклатура;
//Выбираем аналоги из регистра сведений "Аналоги номенклатуры"
НаборЗаписей = РегистрыСведений.АналогиНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(НаимНом);
НаборЗаписей.Прочитать();

           
Для Каждого ЭлемЗапись Из НаборЗаписей Цикл
// Чтение и сообщение данных полей записи.
Если Не ПустаяСтрока(ЭлемЗапись) Тогда
ЭлемНоменклатура = ЭлемЗапись.Номенклатура;
ЭлемАналог = ЭлемЗапись.Аналог;
НоваяСтрока = ТабПоле.Добавить();
НоваяСтрока.Номенклатура = ЭлемНоменклатура;
НоваяСтрока.АналогНоменклатуры = ЭлемАналог;
Фильтр = Новый Структура;
    Фильтр.Вставить("Номенклатура",ЭлемАналог);
    Дата = ТекущаяДата();
    // Параметр "н" отражает наличие товара в регистре остатков
    н = 0;
    // получение остатков будет производиться специальной функцией Остатки
    // для регистра накопления – возвращается таблица значений
    ТаблицаОстатков = РегистрыНакопления.ТоварыНаСкладах.Остатки(Дата,Фильтр,,);
    Для каждого СтрокаТаблицы из ТаблицаОстатков цикл
    // Перебор строк
Сообщить("Номенклатура " + Строка(ЭлемЗапись.Номенклатура) + " Имеет аналог  " + СтрокаТаблицы.Номенклатура + " с остатком на складе " + СтрокаТаблицы.Количество);
    н = 1;
НоваяСтрока.ОстатокНаСкладе = СтрокаТаблицы.Количество;
    КонецЦикла;
    // Для товаров, отсутствующих в регистре остатков,
    // указываем остаток, равный 0
Если н = 0 Тогда
НоваяСтрока.ОстатокНаСкладе = н;
    Сообщить("Аналог " + ЭлемАналог + " С остаткам на складе: 0");
КонецЕсли;

  Иначе
Сообщить("Номенклатура " + Строка(ЭлемЗапись.Номенклатура) + " аналога не имеет!!! ");
КонецЕсли;
КонецЦикла;
КонецЦикла;


Для Каждого ЭлемНомТабПоля Из ТабПоле Цикл
ПерНом = ЭлемНомТабПоля.Номенклатура;
Сообщить("Галимая " + ПерНом);
ПерОстНаСкладе = ЭлемНомТабПоля.ОстатокНаСкладе;
Сообщить("Номенклатура ТабПоля: "+ ПерНом + " с остатком " + ПерОстНаСкладе);
Если Число(ПерОстНаСкладе) <> 0 Тогда
Для каждого СтрТабПоля из докПланЗакупок.СоставПлана Цикл
ПерНомВДок = СтрТабПоля.Номенклатура;
Сообщить("Это ПерНомВДок " + ПерНомВДок);
ПерКолВДок = СтрТабПоля.Количество;
Сообщить("Это ПерКолВДок " + ПерКолВДок);
Если СокрЛП(ПерНомВДок) = СокрЛП(ПерНом)  Тогда
Сообщить(Строка(ПерКолВДок) + " Старое количество!!!!!!!!!!!!!!!!!!");
НовКол = Число(ПерКолВДок - ПерОстНаСкладе);
Сообщить("Рассчитано: " + Строка(НовКол));
РедКол = СтрТабПоля.Количество;
Сообщить(Строка(РедКол) + " Новое количество!!!!!!!!!!!!!!!!!!");
                                        //А ВОТ ЗДЕСЬ НЕ МОГУ ЗАМЕНИТЬ СТАРОЕ КОЛИЧЕСТВО НА НОВОЕ!
Иначе
  Сообщить(ПерНом +" не найдена!!!");
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
СамДокумент = докПланЗакупок.ПолучитьФорму();
СамДокумент.Открыть();
//докПланЗакупок.Записать();
КонецПроцедуры


Оффлайн has

  • Модератор
  • *****
  • Сообщений: 1308
  • РЕПУТАЦИЯ: 285
  • КПД: 22%
  • Регистрация: 2011-01-28
  • Сайт: 
  • Профессия: Программист 1С
Если я правильно понял докПланЗакупок имеет тип ДокументСсылка. Чтобы изменить данные документа, также и его таб части, необходимо получить объект документа. Чтоб понятней было, то как-то так
ОбъектПланЗакупок = докПланЗакупок.ПолучитьОбъект();
Для каждого СтрТабПоля из ОбъектПланЗакупок.СоставПлана Цикл

Оффлайн Yuriy78

  • *
  • Сообщений: 10
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-07
  • Сайт: 
  • Профессия: Ученик 1С
Если я правильно понял докПланЗакупок имеет тип ДокументСсылка. Чтобы изменить данные документа, также и его таб части, необходимо получить объект документа. Чтоб понятней было, то как-то так
ОбъектПланЗакупок = докПланЗакупок.ПолучитьОбъект();
Для каждого СтрТабПоля из ОбъектПланЗакупок.СоставПлана Цикл
Спасибо. Понял, сейчас попробую. Но в дальнейшем обработка будет запускаться из открытого документа "План закупок"

Оффлайн has

  • Модератор
  • *****
  • Сообщений: 1308
  • РЕПУТАЦИЯ: 285
  • КПД: 22%
  • Регистрация: 2011-01-28
  • Сайт: 
  • Профессия: Программист 1С
А все равно наверно. Будешь просто передавать в обработку ссылку на документ, в ней получать объект документа для изменения. Все зависит от условия задачи конечно.

Оффлайн Yuriy78

  • *
  • Сообщений: 10
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-07
  • Сайт: 
  • Профессия: Ученик 1С
А все равно наверно. Будешь просто передавать в обработку ссылку на документ, в ней получать объект документа для изменения. Все зависит от условия задачи конечно.

Условия такие. Нужно в документе "План закупок", полученный с учетом остатков на складе номенклатуры, но без учета остатков на складе аналогов номенклатуры. Произвести учет остатка аналогов сохранить и провести документ на основании которого будут формироваться заказы поставщикам

Оффлайн has

  • Модератор
  • *****
  • Сообщений: 1308
  • РЕПУТАЦИЯ: 285
  • КПД: 22%
  • Регистрация: 2011-01-28
  • Сайт: 
  • Профессия: Программист 1С
Ну тогда если из документа будешь обработку вызывать, то передаешь ссылку. Опять же если документ записан, если новый документ, то передастся пустая ссылка.

Оффлайн Yuriy78

  • *
  • Сообщений: 10
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-07
  • Сайт: 
  • Профессия: Ученик 1С
Исправил, как и советовали. Все равно не сохраняет полученное количество в документе. Что не так?

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

Оффлайн Yuriy78

  • *
  • Сообщений: 10
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-07
  • Сайт: 
  • Профессия: Ученик 1С
Пожалуйста, подскажите почему не сохраняет рассчитанное количество номенклатуры. Вроде делаю все правильно. Условия все выполняются. Информационные сообщение все выводятся, а в табличной части документа количество не изменяется.  :(

Оффлайн has

  • Модератор
  • *****
  • Сообщений: 1308
  • РЕПУТАЦИЯ: 285
  • КПД: 22%
  • Регистрация: 2011-01-28
  • Сайт: 
  • Профессия: Программист 1С
В таких случаях пользуйтесь отладчиком. Если выводит новое количество, тогда только он и поможет. Ну и смотреть тип у ОбъектПланЗакупок. Если не знаете как пользоваться отладчиком, то гугл в помощь.

Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
 Для Каждого ЭлемНомТабПоля Из ТабПоле Цикл
            ПерНом = ЭлемНомТабПоля.Номенклатура;
            Сообщить("Галимая " + ПерНом);
            ПерОстНаСкладе = ЭлемНомТабПоля.ОстатокНаСкладе;
            Сообщить("Номенклатура ТабПоля: "+ ПерНом + " с остатком " + ПерОстНаСкладе);
            Если Число(ПерОстНаСкладе) <> 0 Тогда
                Для каждого СтрТабПоля из докПланЗакупок.СоставПлана Цикл
                    ПерНомВДок = СтрТабПоля.Номенклатура;
                    Сообщить("Это ПерНомВДок " + ПерНомВДок);
                    ПерКолВДок = СтрТабПоля.Количество;
                    Сообщить("Это ПерКолВДок " + ПерКолВДок);
                Если СокрЛП(ПерНомВДок) = СокрЛП(ПерНом)  Тогда
                    Сообщить(Строка(ПерКолВДок) + " Старое количество!!!!!!!!!!!!!!!!!!");
                    НовКол = Число(ПерКолВДок - ПерОстНаСкладе);
                    Сообщить("Рассчитано: " + Строка(НовКол));
                    РедКол = СтрТабПоля.Количество;
                    Сообщить(Строка(РедКол) + " Новое количество!!!!!!!!!!!!!!!!!!");
                                        //А ВОТ ЗДЕСЬ НЕ МОГУ ЗАМЕНИТЬ СТАРОЕ КОЛИЧЕСТВО НА НОВОЕ!
                    //А так?
                    СтрТабПоля.Количество = НовКол;
                Иначе
                      Сообщить(ПерНом +" не найдена!!!");
                КонецЕсли;
                КонецЦикла;
            КонецЕсли;   
        КонецЦикла;
        СамДокумент = докПланЗакупок.ПолучитьФорму();
        СамДокумент.Открыть();
        //докПланЗакупок.Записать();
КонецПроцедуры
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!


Теги:
 

Не открывает форму сохраненного документа, открывает форму нового.

Автор EHOTРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 4473
Последний ответ 13 Апр 2012, 23:26
от Vit1501
Добавление сведений в графу "основание" документа "ТОРГ-12"

Автор Ярослав1984Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 4
Просмотров: 7742
Последний ответ 20 Авг 2013, 18:45
от Ярослав1984
"Не совпадают сумма документа и общая сумма по платежным ведомостям"

Автор yunovoРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 4780
Последний ответ 11 Янв 2015, 02:55
от MuI_I_Ika
При создании нового документа "Заявка на кассовый расход" Ошибка "Значение 9 поля "номер" не уникально

Автор ppkmliteРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 14
Просмотров: 8504
Последний ответ 22 Ноя 2014, 04:50
от cska-fanat-kz
Фамилия руководителя в печатных формах документа "Акт сверки", "Акт об оказании"

Автор MKozzlikРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 7341
Последний ответ 03 Фев 2012, 17:27
от Dinah

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

Смотрите бесплатно более 300 видеоуроков по работе в 1С:Бухгалтерия 8 и 1C:ЗУП 8 ред. 3.0

СМОТРЕТЬ >>

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
180 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
51 Сообщений
alex0402
49 Сообщений
andron81_81
39 Сообщений
AIFrame
37 Сообщений
MuI_I_Ika MuI_I_Ika
34 Сообщений
BuhRust
29 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 228
  • Точка Скрытых: 0
  • Точка Пользователей: 1
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal