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

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем lile4ka, 9 апр 2015.

  1. TopicStarter Overlay
    lile4ka
    Offline

    lile4ka

    Регистрация:
    9 апр 2015
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте, уважаемые программисты :)

    При разработке конфигурации столкнулась со следующей ситуацией. У меня есть документ "Заявка", в котором присутствует реквизит "Статус" со значениями, взятыми из перечислений "Назначен", "Выполняется", "Выполнено", "Не выполнено". Поскольку я новичок в этом деле и это моя первая разработка, все значения реквизитов для каждой заявки приходится менять вручную. Статус заявки при проведении документа фиксируется в соответствующем регистре сведений "Статус заявки".
    Помимо этого с заявкой связаны документы "ЗаказМатериаловДляВыполненияУслуги" и "АктОказанияУслуг". Подскажите, пожалуйста, как сделать, чтобы при записи "Заказа материалов" (его движения ни в одном из созданных регистров не отражаются) движения документа "Заявка" перепизасывались с соответствующим изменением реквизита "Статус" на "Назначено", и при проведении док-та "Акт оказания услуг" (регистр накопления "Услуги") статус в док-те "Заявка" менялся на "Выполнено".
    Вот модули объектов всех документов

    Код:
    Заявка: Процедура ОбработкаПроведения(Отказ, Режим)
    // регистр СтатусЗаявки
    Движения.СтатусЗаявки.Записывать = Истина;
    Движение = Движения.СтатусЗаявки.Добавить();
    Движение.СрокИсполнения = СрокИсполнения;
    Движение.Исполнитель = Исполнитель;
    Движение.Статус = Статус;
    КонецПроцедуры
    Заказ материалов для оказания услуги: Процедура
    Код:
    ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаНаОказаниеПлатныхУслуг") Тогда
    Исполнитель = ДанныеЗаполнения.Исполнитель;
    ДокументОснование = ДанныеЗаполнения.Ссылка;
    Для Каждого ТекСтрокаТабличнаяЧасть1 Из ДанныеЗаполнения.ТабличнаяЧасть1 Цикл
    НоваяСтрока = ТабличнаяЧасть1.Добавить();
    НоваяСтрока.Услуга = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
    КонецЦикла;
    ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаНаОказаниеБесплатныхУслуг") Тогда
    Исполнитель = ДанныеЗаполнения.Исполнитель;
    ДокументОснование = ДанныеЗаполнения.Ссылка;
    Для Каждого ТекСтрокаТабличнаяЧасть1 Из ДанныеЗаполнения.ТабличнаяЧасть1 Цикл
    НоваяСтрока = ТабличнаяЧасть1.Добавить();
    НоваяСтрока.Услуга = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
    Акт оказания услуг:
    Код:
    Процедура ОбработкаПроведения(Отказ, Режим)
    // регистр Услуги
    Движения.Услуги.Записывать = Истина;
    Для Каждого ТекСтрокаТабличнаяЧасть1 Из ТабличнаяЧасть1 Цикл
    Движение = Движения.Услуги.Добавить();
    Движение.Период = Дата;
    Движение.ВидУслуги = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
    Движение.Исполнитель = Исполнитель;
    Движение.Количество = ТекСтрокаТабличнаяЧасть1.Количество;
    КонецЦикла;
    КонецПроцедуры
    
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаНаОказаниеПлатныхУслуг") Тогда
    Инициатор = ДанныеЗаполнения.Заказчик;
    Исполнитель = ДанныеЗаполнения.Исполнитель;
    ДокументОснование = ДанныеЗаполнения.Ссылка;
    Для Каждого ТекСтрокаТабличнаяЧасть1 Из ДанныеЗаполнения.ТабличнаяЧасть1 Цикл
    НоваяСтрока = ТабличнаяЧасть1.Добавить();
    НоваяСтрока.ВидУслуги = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
    НоваяСтрока.Количество = ТекСтрокаТабличнаяЧасть1.Количество;
    КонецЦикла;
    ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаНаОказаниеБесплатныхУслуг") Тогда
    Инициатор = ДанныеЗаполнения.Заказчик;
    Исполнитель = ДанныеЗаполнения.Исполнитель;
    ДокументОснование = ДанныеЗаполнения.Ссылка;
    Для Каждого ТекСтрокаТабличнаяЧасть1 Из ДанныеЗаполнения.ТабличнаяЧасть1 Цикл
    НоваяСтрока = ТабличнаяЧасть1.Добавить();
    НоваяСтрока.ВидУслуги = ТекСтрокаТабличнаяЧасть1.ВидУслуги;
    НоваяСтрока.Количество = ТекСтрокаТабличнаяЧасть1.Количество;
    КонецЦикла;
    КонецЕсли;
    
    КонецПроцедуры
    Спасибо! С уважением, грустный студент :)
    Последнее редактирование модератором: 9 апр 2015
  2. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.750
    Симпатии:
    509
    Баллы:
    204
    Грустный студент, купите версию 1С для обучения программирования, подобные вопросы сразу отпадут.
    И оформляйте код тегами code
  3. TopicStarter Overlay
    lile4ka
    Offline

    lile4ka

    Регистрация:
    9 апр 2015
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Замечание по поводу оформления кода учла.
    К сожалению, у меня нет возможности купить версию. Я создаю эту конфигурацию для своего диплома, и описанная выше проблема - единственное, что осталось исправить в моей программе.
    И к сожалению, я совершенно не понимаю, как это сделать. Что, как и куда прописывать, чтобы это заработало.
  4. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.750
    Симпатии:
    509
    Баллы:
    204
    С этой версией идет книжка, ее можно скачать в электронном виде, вот почитайте, и поймете, как и куда прописывать, чтоб заработало.
  5. TopicStarter Overlay
    lile4ka
    Offline

    lile4ka

    Регистрация:
    9 апр 2015
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Вы, вероятно, имеете в виду книгу Радченко? У меня есть она, я уже всю ее просмотрела и не нашла ответа на свой вопрос, поняла, что нужно Заказ и Акт сделать также регистраторами для регистра "Статус заявки", но что делать дальше, не понимаю.
  6. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.750
    Симпатии:
    509
    Баллы:
    204
    Правильно. Эти доки нужно добавить в измерение. При каких-то действиях обращаться к этим данным с отбором по виду дока, и выдергивать значения для подстановки в новый документ.
  7. TopicStarter Overlay
    lile4ka
    Offline

    lile4ka

    Регистрация:
    9 апр 2015
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    При проведении обращаться... А как именно? можете привести пример?
  8. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.750
    Симпатии:
    509
    Баллы:
    204
    т.е. вы пишите конфу и ниразу не выбирали значения ? Конфа вообще без отчетов ?
    --- Объединение сообщений, 9 апр 2015 ---
    Я вам алгоритм накидал, хотите чтоб и код написал :) ?
  9. TopicStarter Overlay
    lile4ka
    Offline

    lile4ka

    Регистрация:
    9 апр 2015
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    С отчетами, конечно, но хоть убейте, ну не понимаю я, как именно сделать так, чтобы в документе изменялся автоматически статус заявки.

    Извините, что так пишу, мне самой жутко неудобно за свою глупость в этом вопросе.
  10. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.750
    Симпатии:
    509
    Баллы:
    204
    Смотрите, в иб хранятся какие-то данные (на то она и бд). Есть механизмы, которые этими данными оперируют.
    Если вы делаете документ на основании какого-то дока и вам нужно в этот новый док вставить какие-то данные, то используются некоторые обрабочики, в которых можно прописать заполнение какими-то уже существующими данными. Для отбора таких значений есть куча механизмов.
  11. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Так делать не надо.
    Не должны движения одного документа менять движения другого.
    Необходимость самого реквизита "Статус" в документе "Заявка" также сомнительна.

    Если общим итогом всех действий должно стать получение того, в каком статусе находятся заявки - то эти данные нужно получать отчетом, который будет брать данные из вашего регистра сведений. При необходимости текущий статус можно отобразить и в самом документе, получив данные, опять таки запросом к вашему регистру сведений.

    Тонкостей задумки конфигурации я не знаю. Навскидку.
    Логически, поскольку нужно отслеживать состояние Заявок, там должно присутствовать измерение Заявка (тип Документ.Заявка). Исполнитель, СрокИсполнения - это вероятнее всего Реквизиты. С полем Статус - тут возможны варианты: либо Измерение либо Реквизит, и собственно от этого зависит периодический регистр сведений вам делать или нет. Склоняюсь к периодическому. Таким образом Статус будет Реквизитом. Периодичность ну например Секунда (хотя тоже обсуждаемо).
    Ну собственно все. Код для записи в этот РС у вас вроде есть уже.

    Чтобы узнать текущее состояние заявки(-ок) вам надо сделать простейший запрос к вашему Регистру сведений (СрезПоследних). И либо показать на форме документа, либо вывести в отчет.

    Естетсвенно по-хорошему это не все, поскольку НАПРИМЕР также неплохо контролировать текущее состояние заявки при проведении документов "ЗаказМатериаловДляВыполненияУслуги" и "АктОказанияУслуг", с тем чтобы не допустить например проведение документа АктОказанияУслуг до того как будет введен и проведен документ ЗаказМатериаловДляВыполненияУслуги. Или наоборот, не допустить отмены проведения ЗаказМатериаловДляВыполненияУслуги после того как будет введен АктОказанияУслуг. Но это все уже от конкретной бизнес логики зависит.
  12. TopicStarter Overlay
    lile4ka
    Offline

    lile4ka

    Регистрация:
    9 апр 2015
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    По логике, заказав материалы на оказание услуг мы можем считать, что начался процесс выполнения заявки, почему тогда при проведении документа Заказ нельзя , чтобы в заявке изменялся статус?

    Структура рег сведений представлена на фото, но изначально у меня двигался по нему только док-т Заявка.

    Просто если не использовать движения документов Заказ и Акт, мне придется постоянно вручную менять статус заявки? пользователь ведь может забыть в какой-то момент.

    Я обработку проведения Заказа и добавила 3 строки, движения заявки стали перезаписываться.

    Процедура ОбработкаПроведения(Отказ, Режим)


    // регистр СтатусЗаявки
    Движения.СтатусЗаявки.Записывать = Истина;
    Движение = Движения.СтатусЗаявки.Добавить();
    Движение.Заявка = ДокументОснование;
    Движение.Статус = СтатусЗаявки;

    ДокОсн = ДокументОснование.ПолучитьОбъект();
    ДокОсн.Статус = СтатусЗаявки;
    ДокОсн.Записать(режимзаписидокумента.проведение);



    КонецПроцедуры

    Думаете, лучше вручную менять и все оставить так, как есть?

    Вложения:

  13. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а что мешает сделать регистр сведений периодическим и тогда вы сможете отследить по времени изменение Статуса. Просто каждый ваш документ будет в регистр свой статус записывать и через СрезПоследних на дату всегда можно будет текущй статус получить и не надо менять будет и перепроводить документ Заявка или как он у вас
  14. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    "Нельзя" чтобы один документ менял что-то в другом документе. Т.е. поле "Статус" не должно быть реквизитом документа.
    --- Объединение сообщений, 9 апр 2015 ---
    Зачем в ручную? Я в своем посте выше описал вам приблизительную логику взаимодействия документов, регистра сведений и того как получать текущий статус документа.
  15. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    полностью поддерживаю, это вы потом концов не найдете. А в регистре у вас раз записи подчинены регистратору, то по идее затрется прежняя и встанет новая, вот и все.
  16. TopicStarter Overlay
    lile4ka
    Offline

    lile4ka

    Регистрация:
    9 апр 2015
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Делаю этот РС периодическим, затем создаю общий модуль с функцией

    Функция АктуальныйСтатус(АктуальнаяДата, ЭлементЗаявок) Экспорт
    Отбор=Новый Структура("Заявка",ЭлементЗаявок);
    ЗначенияРесурсов = РегистрыСведений.СтатусЗаявки.ПолучитьПоследнее(АктуальнаяДата, Отбор);
    Возврат ЗначенияРесурсов.Статус;
    КонецФункции

    Потом привязать эту функцию ко всем используемым документам?
  17. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    вам запись в регистр в каждом документе надо, а функция для получения статуса нужна вам для отчетов (возможно)
    --- Объединение сообщений, 9 апр 2015 ---
    я же так понимаю, что каждый документ у вас это определенный статус заявки, так? При чем вам бы неплохо еще последовательность прослеживать документов, чтоб в логическую цепочку выстроились они
  18. TopicStarter Overlay
    lile4ka
    Offline

    lile4ka

    Регистрация:
    9 апр 2015
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    я не понимаю тогда, как при открытии дока Заявка обновлять поле Статус на СтатусСрезПоследних, если мне не нужна функция
  19. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    вам же черным по белому пишут - Статус лучше не пихать в реквизит... сделайте некий список заявок и актуальный статус туда тяните и все
  20. TopicStarter Overlay
    lile4ka
    Offline

    lile4ka

    Регистрация:
    9 апр 2015
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Извините, что уже замучила вас своими глупыми вопросами. Ну никак не доходит до меня!

    У меня же для каждой заявки должно отслеживаться ее выполнение
    --- Объединение сообщений, 9 апр 2015 ---
    Куда мне тогда это статус пихать, если не в реквизит?
    Последнее редактирование: 9 апр 2015

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