Вопрос № 122378: Здравствуйте, эксперты. Версия 7.7. типовая конфигурация. Есть справочник спецодежда с атрибутами наименование и количество. Также существует документ "Изменение состояния" с реквизитом табличной части спецодежда типа "Справочник.Спецо...
Вопрос № 122.378
Здравствуйте, эксперты. Версия 7.7. типовая конфигурация. Есть справочник спецодежда с атрибутами наименование и количество. Также существует документ "Изменение состояния" с реквизитом табличной части спецодежда типа "Справочник.Спецодежда". Нужно, чтобы при выборе в этом документе из справочника вида спецодежды автотически уменьшалось ее количество. Попробовал написать в модуле документа "Изменение состояния" такую процедуру:
Процедура ОбработкаПроведения()
Спр=СоздатьОбъект("Справочник.Костюмы");
Кол=Спр.Количество;
Нам=Спр.Наименование;
Если Нам.Выбран()=1 тогда
Кол=кол -1;
КонецЕсли;
КонецПроцедуры
Но желаемого результата это не принесло. Может быть использовать регистры? Но как это реализовать? Если, можно дайте, пожайлуста, развернутый ответ. Я в этом языке новичок.
Отвечает: Ткаченко Алексей Васильевич !!! Здравствуйте, Чепиков Александр Валерьевич! При изменении значения в справочнике его необходимо записать. Тоесть к Вашему примеру нужно добавить строку Процедура ОбработкаПроведения() Спр=СоздатьОбъект("Справочник.Костюмы"); Кол=Спр.Количество; Нам=Спр.Наименование; Если Нам.Выбран()=1 тогда Спр.Количество = кол -1; Спр.Записать(); КонецЕсли; КонецПроцедуры
Ответ отправил: Ткаченко Алексей Васильевич (статус: 2-ой класс)
Ответ отправлен: 09.02.2008, 20:55 Оценка за ответ: 4 Комментарий оценки: Спасибо за помощь, но что-то все равно не работает. Но это, наверное, я выбрал не совсем адекватный способ учета количества
Отвечает: Астафьев Александр Николаевич
Здравствуйте, Чепиков Александр Валерьевич! Сложно понять сначала вы пишете "...существует документ "Изменение состояния" с реквизитом табличной части спецодежда типа "Справочник.Спецодежда"..." а потом в модуле создаете объект "Справочник.Костюмы"? Ну будем предполагать что это все же один и тот же справочник только вы где то название перепутали. Если у документа как вы пишете существует реквизит табличной части спецодежда типа "Справочник.Спецодежда", пусть
он и называется например "Костюмы" (как он у вас действительно называется я думаю вы определите) и тогда модуль проведения должен выглядеть как в приложении. Если в табличной части существует реквизит количество для "Костюмы" то соответствующая строка будет:
Спр.Количество = Спр.Количество - Количество;
Вообще то хранить информацию об изменении количества в справочнике странный вариант. Например что вы будете делать если снимете документ с проведения, вам нужно будет вернуть количество обратно, а как это сделать? Если кто то повторно перепроведет документ, он второй раз сминусует количество! Что бы этого избежать нужна проверка минусовал уже данный документ количество или нет, а как это сделать? Что бы избежать подобного нужно задействовать то что предусмотрено в программе - регистры, план счетов или журнал
расчетов. Я так понял вы хотите задействовать регистры. Возьмите книгу "Конфигурирование и Администрирование" прочитайте как создать регистр. Вам нужны как минимум: Измерение "Спецодежда" тип "Справочник.Спецодежда", ресурс "Количество" тип "Число". Кроме документа "Изменение состояния" который я так понял расходует спецодежду понадобится другой документ который будет приходовать спецодежду (это отдельная тема дл
я разговора). В итоге когда Вы создадите регистр назовем его "СпецОдеждаНаличие", тогда модуль проведения документа "Изменение состояния" будет выглядеть так:
Процедура ОбработкаПроведения()
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Регистр.СпецОдеждаНаличие.Спецодежда=Костюмы;
Регистр.СпецОдеждаНаличие.Количество = 1;
//если у документа есть реквизит количество тогда так
//Регистр.СпецОдеждаНаличие.Количество = Количество;
Регистр.СпецОдеждаНаличие.ДвижениеРасходВыполнить();
КонецЦикла;
КонецПроцедуры
У документа поступления спецодежды будет все так же кроме последней строки в цикле там будет:
Регистр.СпецОдеждаНаличие.ДвижениеПриходВыполнить();
Удачи!!!
Приложение:
Ответ отправил: Астафьев Александр Николаевич (статус: 10-ый класс)
Ответ отправлен: 09.02.2008, 22:37 Оценка за ответ: 5 Комментарий оценки: Спасибо, наставили на путь истинный
Отвечает: Сергей Максименко [Elric]
Здравствуйте, Чепиков Александр Валерьевич!
Для этой задачи Вам понадобится либо регистр (для этого должна быть установлена компонента Оперативный учет), либо бухгалтерский счет (для этого должна быть установлена компонента Бухгалтерский учет). Буду исходить из того, что у Вас компонента Оперативный учет установлена (раз уж Вы упомянули регистры).
1. В Конфигурации создаете новый регистр, "Тип регистра" ставите "Остатки" (впрочем, он уже сразу выбран по умолчанию). Присваиваете идентификатор ОстаткиСпецодежды, синоним "Остатки спецодежды". Создаете измерение Спецодежда типа "Справочник.Спецодежда". Создаете ресурс Количество.
2. Делаете двойной щелчок по документу "Изменение состояния" и ставите галочку "Оперативный учет" (без этого не сможете делать движения по регистру). Правильнее было бы завести реквизит табличной части Количество, где указывать сколько спецодежды надо списать (1,0,-1 и т.д.), однако буду исходить из оглашенных условий, списывать единицу если выбран элемент справочника Спецодежда. В модуле документа процедура ОбработкаПроведения() должна быть следующей:
Процедура ОбработкаПроведения()
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Если Спецодежда.Выбран()=1 Тогда
Регистр.ОстаткиСпецодежды.ДвижениеРасход(Спецодежда,1); // списываем единицу спецодежды
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Таким образом, количество спецодежды в регистре будет уменьшаться при проведении документа, причем только один раз независимо от количества перепроведений. Однако как в регистр попадут начальные остатки и поступления спецодежды? Для этого понадобится другой документ, скажем, "Приход спецодежды". Он будет похожим на "Изменение состояния", только я все же рекомендовал бы добавить реквизит Количество, и тогда обработка проведения для него будет выглядеть так:
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Если Спецодежда.Выбран()=1 Тогда
Регистр.ОстаткиСпецодежды.ДвижениеПриход(Спецодежда,Количество); // списываем несколько единиц спецодежды
КонецЕсли;
КонецЦикла;
КонецПроцедуры
А теперь самое интересное. Как же теперь узнать остатки спецодежды на текущий момент времени? Как достать данные, накопленные в регистре? На самом деле это легко.
Допустим, в переменной Спецодежда у нас ссылка на элемент справочника, для которого нужно узнать остаток на текущий момент. Тогда формула будет выглядеть так:
Остаток=Регистр.ОстаткиСпецодежды.Остаток(Спецодежда,"Количество");
А например (как частный случай) ести желаете вставить колонку "Остаток" в справочник "Спецодежда" или вывести остаток в форме элемента, то функция ОстатокНаСегодня(), которая будет возвращать искомый остаток, будет выглядеть так:
Функция ОстатокНаСегодня()
Возврат Регистр.ОстаткиСпецодежды.Остаток(ТекущийЭлемент(),"Количество");
КонецФункции
Надеюсь, это было достаточно подробно и последовательно. Если что-то не получится, пишите в мини-форум, разберемся :)
--------- В творчестве рождается истина
Ответ отправил: Сергей Максименко [Elric] (статус: Профессионал) Украина, Киев Тел.: (044) 22-88-369 Организация: МАКСЕР, "1С:Предприятие" в Киеве Адрес: г. Киев WWW:www.makser.com.ua ---- Ответ отправлен: 10.02.2008, 02:08 Оценка за ответ: 5 Комментарий оценки: Все очень подробно и последовательно. Более исчерпывающий ответ и представить трудно