Помогите решить проблему с двойной записью
если строку не закомментировать то происходит двойная запись, если закомментировать документ состояние абонемента не проводится
код модуля объекта
если строку не закомментировать то происходит двойная запись, если закомментировать документ состояние абонемента не проводится
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если Объект.Единицы=Истина Тогда
ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи);
Иначе
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
Абонемент = Объект.Клиент.ТекущийАбонемент;
Документ=Документы.СостояниеАбонемента.Выбрать();
Пока Документ.Следующий() Цикл
Если Абонемент =Документ.Ссылка Тогда
ДокументОбъект = Документ.ПолучитьОбъект();
Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
//ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
Иначе
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
Отказ=Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показатькод модуля объекта
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажаТоваров.Товар,
| СУММА(ПродажаТоваров.Количество) КАК Количество,
| МАКСИМУМ(ЕСТЬNULL(ТоварооборотОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
|ИЗ
| Документ.ПродажаТоваровИУслуг.Товары КАК ПродажаТоваров
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Товарооборот.Остатки(&МоментВремени) КАК ТоварооборотОстатки
| ПО ПродажаТоваров.Товар = ТоварооборотОстатки.Товар
|ГДЕ
| ПродажаТоваров.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПродажаТоваров.Товар";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Движения.Товарооборот.Записывать=Истина;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ЕСЛИ ВыборкаДетальныеЗаписи.Количество>ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
Сообщить("Недостаточное количество товара " + ВыборкаДетальныеЗаписи.Товар+" необходимо "
+ВыборкаДетальныеЗаписи.Количество+". В наличии "+ВыборкаДетальныеЗаписи.КоличествоОстаток);
Отказ=Истина;
Движения.Товарооборот.Записывать=Ложь;
КонецЕсли;
Если Отказ тогда
Продолжить;
КонецЕсли;
СуммаПоДокументу1 = 0;
Для Каждого ТекСтрокаТовары Из Товары Цикл
СуммаПоДокументу1 = СуммаПоДокументу1+ТекСтрокаТовары.Сумма;
КонецЦикла;
СуммаПоДокументу2 = 0;
Для Каждого ТекСтрокаУслугиИАбонементы Из УслугиИАбонементы Цикл
СуммаПоДокументу2 = СуммаПоДокументу2+ТекСтрокаУслугиИАбонементы.Сумма;
КонецЦикла;
Движение=Движения.Товарооборот.Добавить();
Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
Движение.Период=Дата;
Движение.Товар=ВыборкаДетальныеЗаписи.Товар;
Движение.Количество=ВыборкаДетальныеЗаписи.Количество;
Движение.Сумма= СуммаПоДокументу1+СуммаПоДокументу2;
КонецЦикла;
///////////////////////////////////////////////////////////
// регистр ПродажиКлиентам
Движения.ПродажиКлиентам.Записывать = Истина;
Для Каждого ТекСтрокаУслугиИАбонементы Из УслугиИАбонементы Цикл
Движение = Движения.ПродажиКлиентам.Добавить();
Движение.Период = Дата;
Движение.Товар = ТекСтрокаУслугиИАбонементы.Услуга;
Движение.Количесвто = ТекСтрокаУслугиИАбонементы.Количество;
Движение.Сумма = Сумма;
Движение.СуммаЕди = СуммаЕд;
Движение.Клиент = Клиент;
Движение.Сотрудник = Сотрудник;
КонецЦикла;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ПродажиКлиентам.Добавить();
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовары.Товар;
Движение.Количесвто = ТекСтрокаТовары.Количество;
Движение.Сумма = Сумма;
Движение.СуммаЕди = СуммаЕд;
Движение.Клиент = Клиент;
Движение.Сотрудник = Сотрудник;
КонецЦикла;
КонецПроцедуры
ПоказатьПо теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(14) ture, шаблон нужно брать не из книжки, а разрабатывать под каждую конкретную задачу самостоятельно. Он-же паттерн. А потом уже код под него писать. А тут явно какая-то путаница - при записи одного документа проводить другой - это ни в какие ворота.
(15) Здесь все правильно написано о шаблоне или паттерне (надо бы вообще на большее количество языков переводить одно слово, всегда прокатывает много раз сказать одно слово , но на разных языках).
Человек верно делает, что пробует все. Отличие 1С в том, что отработанный пример в 1С нельзя дополнить до идеала, надо все либо куда-то переносить либо удалять все и писать снова и по другому. В любом ООП таких шаблонов не найти. Нельзя в 1С вылезать решение, если не там написал. Шаблон как бог в 1С, утром встаешь и молишься на него. Увы.
Человек верно делает, что пробует все. Отличие 1С в том, что отработанный пример в 1С нельзя дополнить до идеала, надо все либо куда-то переносить либо удалять все и писать снова и по другому. В любом ООП таких шаблонов не найти. Нельзя в 1С вылезать решение, если не там написал. Шаблон как бог в 1С, утром встаешь и молишься на него. Увы.
(27) ture,
Это я для того чтоб всякий понял, что речь именно о паттернах проектирования, ибо термин "шаблон" может пониматься как угодно.
Тут стоит заменить "1С" на "1Сник", и тогда я подпишусь под каждым твоим словом :)
Не хочу конечно выглядеть бешанным фанатом 1С, но сколько уже можно на нее сваливать свои косяки. 1Сники почему-то считают, что им не нужно знать премудростей теории программирования, а потом обвиняют ее-же в своих бедах.
Здесь все правильно написано о шаблоне или паттерне (надо бы вообще на большее количество языков переводить одно слово, всегда прокатывает много раз сказать одно слово , но на разных языках).
Это я для того чтоб всякий понял, что речь именно о паттернах проектирования, ибо термин "шаблон" может пониматься как угодно.
Человек верно делает, что пробует все. Отличие 1С в том, что отработанный пример в 1С нельзя дополнить до идеала, надо все либо куда-то переносить либо удалять все и писать снова и по другому. В любом ООП таких шаблонов не найти. Нельзя в 1С вылезать решение, если не там написал. Шаблон как бог в 1С, утром встаешь и молишься на него. Увы.
Тут стоит заменить "1С" на "1Сник", и тогда я подпишусь под каждым твоим словом :)
Не хочу конечно выглядеть бешанным фанатом 1С, но сколько уже можно на нее сваливать свои косяки. 1Сники почему-то считают, что им не нужно знать премудростей теории программирования, а потом обвиняют ее-же в своих бедах.
(21) Emiliya_Emili, а так
Абонемент = Объект.Клиент.ТекущийАбонемент;
Запрос = Новый Запрос("Выбрать Ссылка Из Документы.СостояниеАбонемента КАК Документ ГДЕ Документ.Ссылка = &Абонемент И Документ.Проведен И НЕ Документ.ПометкаУдаления");
Запрос.УстановитьПараметр("Абонемент ",Абонемент);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат;
КонецЕсли;
Документ=Результат.Выбрать();
Пока Документ.Следующий() Цикл
ДокументОбъект = Документ.ПолучитьОбъект();
Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
Показать
По моему, в обработке проведения можно было использовать новую методику проведения по регистру накопления "Товарооборот". Сначала делаем движения в регистр, потом запросом получаем остатки товара по которому ушли в минус.Если такие строки есть, Отказ = Истина. Так же , для правильности ,перед списанием, не плохо было бы установить блокировки на то, что списываем.
Я вот одного понять не могу.
Зачем городить невесть что для того, чтобы получить Объект документа, ссылка на который известна?
Зачем городить невесть что для того, чтобы получить Объект документа, ссылка на который известна?
Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
Документ = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект()
Иначе
// нет абонемента
КонецЕсли;
Emiliya_Emili, а почему Вы не хотите сделать как вам рекомендовал (29)ditp?
ДокументОбъект= Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
Иначе
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
Отказ=Истина;
КонецЕсли;
Показать
(37) vovan_victory, при попытке провести документ получаю следующее
{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(372)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(1, 92)}: Не задано значение параметра "Абонемент"
ВЫБРАТЬ Документ.Ссылка ИЗ Документ.СостояниеАбонемента КАК Документ ГДЕ Документ.Ссылка = <<?>>&Абонемент И Документ.Проведен И НЕ Документ.По
Результат = Запрос.Выполнить();
по причине:
{(1, 92)}: Не задано значение параметра "Абонемент"
ВЫБРАТЬ Документ.Ссылка ИЗ Документ.СостояниеАбонемента КАК Документ ГДЕ Документ.Ссылка = <<?>>&Абонемент И Документ.Проведен И НЕ Документ.По
(39) vovan_victory, у меня возникает одна интересная ошибка, если клиент новый и он только покупает новый абонемент то вот что выдает программа
что с этим делать
{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(377)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
ДокументОбъект= Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
по причине:
Элемент не выбран!
что с этим делать
(41) Emiliya_Emili,
Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект()
Иначе
ДокументОбъект = Документы.СостояниеАбонемента.СоздатьДокумент();
//Нужно заполнить реквизиты нового документа
..........................
ДокументОбъект.Записать();
КонецЕсли;
Показать
(42) vovan_victory, может мне не создавать документ а ссылаться на процедуру создания?
у меня если клиент покупает абонемент то он либо продлевается либо создается новый
ну или скопировать эту часть
НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
//////////////////////////////////////////////////
Если Объект.Рубли=Истина Тогда
ТекущийДанные=Элементы.УслугиИАбонементы.ТекущиеДанные;
СчетчикПомеченных=Счетчик();
Если СчетчикПомеченных > 0 Тогда
АбонементОбъект=Абонемент();
Если АбонементОбъект=1 Тогда
Клиент=Объект.Клиент;
Абонемент=ТекущийДанные.Услуга;
КолвоЕдиниц =ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"КолвоЕд");
Срок=ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"Срок");
ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
ИначеЕсли АбонементОбъект=2 Тогда
////
КонецЕсли;
КонецЕсли;
КонецЕсли;
///////////////////////////////
Если Объект.Единицы=Истина Тогда
ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи);
Иначе
Отказ=Ложь;
КонецЕсли;
КонецПроцедуры
Функция Счетчик()
СчетчикПомеченных=Объект.УслугиИАбонементы.Количество();
Возврат СчетчикПомеченных;
КонецФункции
Функция Абонемент()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажаТоваровИУслуг1.Ссылка,
| ПродажаТоваровИУслуг.Услуга
|ИЗ
| Документ.ПродажаТоваровИУслуг.УслугиИАбонементы КАК ПродажаТоваровИУслуг
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПродажаТоваровИУслуг КАК ПродажаТоваровИУслуг1
| ПО ПродажаТоваровИУслуг.Ссылка = ПродажаТоваровИУслуг1.Ссылка
|ГДЕ
| ПродажаТоваровИУслуг1.Ссылка = &Ссылка";
ДокументСсылка = Объект.Ссылка;
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Абонементы.Ссылка
|ИЗ
| Справочник.Абонементы КАК Абонементы";
ВыборкаДетальныеЗаписи1 = Запрос.Выполнить().Выбрать();
Один=0;
Пока ВыборкаДетальныеЗаписи.Следующий()Цикл
Пока ВыборкаДетальныеЗаписи1.Следующий()Цикл
Если ВыборкаДетальныеЗаписи.Услуга=ВыборкаДетальныеЗаписи1.Ссылка Тогда
Один=1; //да
Прервать;
Иначе
Один=2; //нет
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Один;
КонецФункции
&НаСервере
Процедура ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок)
Запрос = Новый Запрос("ВЫБРАТЬ
| СостояниеАбонемента.Ссылка,
| СостояниеАбонемента.Клиент,
| СостояниеАбонемента.Абонемент,
| СостояниеАбонемента.СрокДействия,
| СостояниеАбонемента.Состояние,
| СостояниеАбонемента.Единицы
|ИЗ
| Документ.СостояниеАбонемента КАК СостояниеАбонемента
|ГДЕ
| СостояниеАбонемента.Клиент = &Клиент
| И СостояниеАбонемента.Абонемент = &Абонемент
| И СостояниеАбонемента.Состояние = &Состояние");
Запрос.УстановитьПараметр("Клиент", Клиент);
Запрос.УстановитьПараметр("Абонемент", Абонемент);
Запрос.УстановитьПараметр("Состояние", Перечисления.СостояниеАбонемента.Действителен);
Выборка = Запрос.выполнить().выбрать();
Если Выборка.Следующий() Тогда
Документ = Выборка.Ссылка.ПолучитьОбъект();
Документ.Дата=ТекущаяДата();
Документ.СрокДействия=ДобавитьМесяц(Документ.СрокДействия, Срок);
Документ.Состояние=Перечисления.СостояниеАбонемента.Действителен;
Документ.Единицы = Документ.Единицы + КолвоЕдиниц;
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.ТекущийАбонемент=Выборка.Ссылка;
ОбъекткЛ.КоличествоЕдиницВНаличии=Документ.Единицы;
ОбъекткЛ.Записать();
Документ.Записать(РежимЗаписиДокумента.Проведение);
Иначе
Документ = Документы.СостояниеАбонемента.СоздатьДокумент();
Документ.Дата=ТекущаяДата();
Документ.Клиент=Клиент;
Документ.Абонемент=Абонемент;
Документ.СрокДействия=ДобавитьМесяц(ТекущаяДата(), Срок);
Документ.Состояние=Перечисления.СостояниеАбонемента.Действителен;
Документ.Единицы = Документ.Единицы + КолвоЕдиниц;
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.ТекущийАбонемент=Выборка.Ссылка;
ОбъекткЛ.КоличествоЕдиницВНаличии=Документ.Единицы;
ОбъекткЛ.Записать();
Документ.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецПроцедуры
Показатьу меня если клиент покупает абонемент то он либо продлевается либо создается новый
ну или скопировать эту часть
Документ = Документы.СостояниеАбонемента.СоздатьДокумент();
Документ.Дата=ТекущаяДата();
Документ.Клиент=Клиент;
Документ.Абонемент=Абонемент;
Документ.СрокДействия=ДобавитьМесяц(ТекущаяДата(), Срок);
Документ.Состояние=Перечисления.СостояниеАбонемента.Действителен;
Документ.Единицы = Документ.Единицы + КолвоЕдиниц;
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.ТекущийАбонемент=Выборка.Ссылка;
ОбъекткЛ.КоличествоЕдиницВНаличии=Документ.Единицы;
ОбъекткЛ.Записать();
Документ.Записать(РежимЗаписиДокумента.Проведение);
Показать
(55) Emiliya_Emili,
если это новый документ, то должны перейти в "иначе"
пробуем так
одна интересная ошибка, если клиент новый и он только покупает новый абонемент
если это новый документ, то должны перейти в "иначе"
пробуем так
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект()
Если ДокументОбъект = неопределено Тогда
ДокументОбъект = Документы.СостояниеАбонемента.СоздатьДокумент();
//Нужно заполнить реквизиты нового документа
..........................
ДокументОбъект.Записать();
КонецЕсли;
(58) vovan_victory, у меня с созданием ничего не выйдет, так как мне нужно знать какой абонемент покупает человек а при покупки товара я это не узнаю, может будет лучше вывести сообщение о том что для начала нужно купить абонемент? тогда человек покупает абонемент и все работает
(59) Emiliya_Emili,я дума, что как Вам дальше поступить - это Вы должны выбрать сами. Если в случае отсутствия документа Вы хотите прервать выполнение процедуры, то
Если ДокументОбъект = неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "......";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
(60) vovan_victory, попыталась но он просто игнорирует код, провел документ и все
Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
Иначе
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
Отказ=Истина;
КонецЕсли;
Иначе
//ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
Если ДокументОбъект = Неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "У клиента отсутствует абонемент, необходимо его приобрести. ";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
КонецЕсли;
Показать
(61) Emiliya_Emili, в ветке
проверка не нужна.
Иначе
//ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
Если ДокументОбъект = Неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "У клиента отсутствует абонемент, необходимо его приобрести. ";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
КонецЕсли;
Показатьпроверка
Если ДокументОбъект = Неопределено Тогда
(61) Emiliya_Emili,
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();//Пытаемся получить объект по ссылке
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "";
Если ДокументОбъект = Неопределено Тогда //Если ссылка пустая, то вернется неопределено
Текст = "У клиента отсутствует абонемент, необходимо его приобрести. ";
Иначе
//В противном случае корректируем объект
Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
Иначе
Текст = "Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".";
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(Сообщение.Текст) Тогда
Сообщение.Текст = Текст;
Сообщение.Сообщить();
КонецЕсли;
Показать
(63) vovan_victory, и вот что я получаю, если пытаюсь провести документ а у клиента нет абонемента
{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(355)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();//Пытаемся получить объект по ссылке
по причине:
Элемент не выбран!
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
ДокументОбъект= Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
Иначе
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
Отказ=Истина;
КонецЕсли;
КонецПроцедуры
Показать
как получить данные для заполнения абонемента
на клиенте через текущие данные а на сервере?
на клиенте через текущие данные а на сервере?
Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
Иначе
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
Отказ=Истина;
КонецЕсли;
Иначе
АбонементОбъект=Абонемент();
Если АбонементОбъект=1 Тогда
Клиент=Объект.Клиент;
Абонемент=ТекущийДанные.Услуга;
КолвоЕдиниц =ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"КолвоЕд");
Срок=ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"Срок");
ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
ИначеЕсли АбонементОбъект=2 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "У клиента отсутствует/не выбран абонемент, необходимо его приобрести/выбрать. ";
Сообщение.Сообщить();
Отказ=Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Показать
(70) vovan_victory, вот в этой части кода я пытаюсь списывать деньги со счета клиента
но если этого счета нету, то об этом появляется сообщение что нужно его приобрести, хотя при покупке есть исключение если человек собирается покупать абонемент(деньги на счет), то запускается процедура создания и вот с ней как раз возникает проблема, так как мне нужно выяснить какой абонемент решил купить клиент, а эти данные на клиенте, а не на сервере
Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
Иначе
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
Отказ=Истина;
КонецЕсли;
Иначе
Показатьно если этого счета нету, то об этом появляется сообщение что нужно его приобрести, хотя при покупке есть исключение если человек собирается покупать абонемент(деньги на счет), то запускается процедура создания и вот с ней как раз возникает проблема, так как мне нужно выяснить какой абонемент решил купить клиент, а эти данные на клиенте, а не на сервере
Иначе
АбонементОбъект=Абонемент();
Если АбонементОбъект=1 Тогда
Клиент=Объект.Клиент;
Абонемент=Объект.УслугиИАбонементы.Услуга;
КолвоЕдиниц =ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"КолвоЕд");
Срок=ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Срок");
ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
ИначеЕсли АбонементОбъект=2 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "У клиента отсутствует/не выбран абонемент, необходимо его приобрести/выбрать. ";
Сообщение.Сообщить();
Отказ=Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Показать
(74) Emiliya_Emili,
{ТипыАбонементов} на свое замените.
P.S. Надеюсь, телепатограмму принял правильно.
Перем ТипАбонемента;
Если ВвестиЗначение(ТипАбонемента, "Выберите тип абонемента", Тип("СправочникСсылка.{ТипыАбонементов}")) Тогда
СоздатьАбонементаСервере(ТипАбонемента)
КонецЕсли;
{ТипыАбонементов} на свое замените.
P.S. Надеюсь, телепатограмму принял правильно.
(76) ditp, у меня есть процедура создания абонемента и я ее уже использовала, проблема в том что она использовалась на клиенте
а сейчас я пытаюсь сделать то же самое только не знаю как получить данные выбранные пользователем системы
&НаСервере
одна процедура на сервере другая на клиенте, поэтому я не могу использовать текущие данные, что может стать альтернативой?
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
/////////////////////////////////////////////////
Если Объект.Рубли=Истина Тогда
ТекущийДанные=Элементы.УслугиИАбонементы.ТекущиеДанные;
СчетчикПомеченных=Счетчик();
Если СчетчикПомеченных > 0 Тогда
АбонементОбъект=Абонемент();
Если АбонементОбъект=1 Тогда
Клиент=Объект.Клиент;
Абонемент=ТекущийДанные.Услуга;
КолвоЕдиниц =ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"КолвоЕд");
Срок=ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"Срок");
ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
ИначеЕсли АбонементОбъект=2 Тогда
////
КонецЕсли;
КонецЕсли;
КонецЕсли;
///////////////////////////////
КонецПроцедуры
Показатьа сейчас я пытаюсь сделать то же самое только не знаю как получить данные выбранные пользователем системы
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
Иначе
АбонементОбъект=Абонемент();
Если АбонементОбъект=1 Тогда
Клиент=Объект.Клиент;
Абонемент=Объект.УслугиИАбонементы.Услуга;
КолвоЕдиниц =ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"КолвоЕд");
Срок=ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Срок");
ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
ИначеЕсли АбонементОбъект=2 Тогда
Показатьодна процедура на сервере другая на клиенте, поэтому я не могу использовать текущие данные, что может стать альтернативой?
(81) Emiliya_Emili, ой да что заморачиваться -есть же для клиент-сервера
В контексте управляемой формы множество «Объектов переноса данных». Можно выделить системные и определяемые разработчиком.
Системные моделируют на клиенте прикладной объект, в виде одного или несколько элементов данных формы. Создать их вне привязки к реквизитам формы нельзя.
ДанныеФормыСтруктура
ДанныеФормыКоллекция
ДанныеФормыСтруктураСКоллекцией
ДанныеФормыДерево
Преобразование системных объектов переноса данных в прикладные типы и обратно выполняется методами:
ЗначениеВДанныеФормы()
ДанныеФормыВЗначение()
КопироватьДанныеФормы()
ЗначениеВРеквизитФормы()
РеквизитФормыВЗначение()
Часто явное преобразование используется при адаптации существующего решения. Методы могут ожидать (использовать особенности) входные параметры, например ТаблицаЗначений, а не ДанныеФормыКоллекция, или метод был определен в контексте прикладного объекта и стал недоступен для прямого вызова из формы.
Пример 1С v8.1:
// на клиенте в контексте формы
ЗаполнитьКэшПользователей(ПодразделениеСсылка)
Пример 1С v8.2:
// на сервере в контексте формы
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ЗаполнитьКэшПользователей(ПодразделениеСсылка);
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
Объекты переноса данных, структура которых определяется разработчиком это небольшое подмножество типов доступных и на клиенте и на сервере. Наиболее часто в качестве параметров и результатов методов «огрубленного» интерфейса используются:
Примитивные типы (строка, число, булево)
Структура
Соответствие
Массив
Ссылки на прикладные объекты (уникальный идентификатор и текстовое представление)
В контексте управляемой формы множество «Объектов переноса данных». Можно выделить системные и определяемые разработчиком.
Системные моделируют на клиенте прикладной объект, в виде одного или несколько элементов данных формы. Создать их вне привязки к реквизитам формы нельзя.
ДанныеФормыСтруктура
ДанныеФормыКоллекция
ДанныеФормыСтруктураСКоллекцией
ДанныеФормыДерево
Преобразование системных объектов переноса данных в прикладные типы и обратно выполняется методами:
ЗначениеВДанныеФормы()
ДанныеФормыВЗначение()
КопироватьДанныеФормы()
ЗначениеВРеквизитФормы()
РеквизитФормыВЗначение()
Часто явное преобразование используется при адаптации существующего решения. Методы могут ожидать (использовать особенности) входные параметры, например ТаблицаЗначений, а не ДанныеФормыКоллекция, или метод был определен в контексте прикладного объекта и стал недоступен для прямого вызова из формы.
Пример 1С v8.1:
// на клиенте в контексте формы
ЗаполнитьКэшПользователей(ПодразделениеСсылка)
Пример 1С v8.2:
// на сервере в контексте формы
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ЗаполнитьКэшПользователей(ПодразделениеСсылка);
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
Объекты переноса данных, структура которых определяется разработчиком это небольшое подмножество типов доступных и на клиенте и на сервере. Наиболее часто в качестве параметров и результатов методов «огрубленного» интерфейса используются:
Примитивные типы (строка, число, булево)
Структура
Соответствие
Массив
Ссылки на прикладные объекты (уникальный идентификатор и текстовое представление)
Насколько я понял, можно сперва не проводить, а только записать, потом 2 документ провести, проверить сколько записей, и провести 1 документ. Если опять дважды спишется, тогда ковырять (а лучше алгоритм нарисовать типа блоксхем) что за чем происходит.
P.S. эта гениальная идея пришла в голову после прочитанных комментариев =)
P.S. эта гениальная идея пришла в голову после прочитанных комментариев =)
(77) succub1_5, у меня нет нигде в коде проведения документа продаж
//проведение документа состояние абонемента
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
//запись справочника клиенты, списывается также в два раза больше чем положено
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.Записать();
Показать
а может быть проблема в этом коде? и совместно с они и обеспечивают двойное проведение
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажаТоваров.Товар,
| СУММА(ПродажаТоваров.Количество) КАК Количество,
| МАКСИМУМ(ЕСТЬNULL(ТоварооборотОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
|ИЗ
| Документ.ПродажаТоваровИУслуг.Товары КАК ПродажаТоваров
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Товарооборот.Остатки(&МоментВремени) КАК ТоварооборотОстатки
| ПО ПродажаТоваров.Товар = ТоварооборотОстатки.Товар
|ГДЕ
| ПродажаТоваров.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПродажаТоваров.Товар";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Движения.Товарооборот.Записывать=Истина;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ЕСЛИ ВыборкаДетальныеЗаписи.Количество>ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
Сообщить("Недостаточное количество товара " + ВыборкаДетальныеЗаписи.Товар+" необходимо "
+ВыборкаДетальныеЗаписи.Количество+". В наличии "+ВыборкаДетальныеЗаписи.КоличествоОстаток);
Отказ=Истина;
Движения.Товарооборот.Записывать=Ложь;
КонецЕсли;
Если Отказ тогда
Продолжить;
КонецЕсли;
СуммаПоДокументу1 = 0;
Для Каждого ТекСтрокаТовары Из Товары Цикл
СуммаПоДокументу1 = СуммаПоДокументу1+ТекСтрокаТовары.Сумма;
КонецЦикла;
СуммаПоДокументу2 = 0;
Для Каждого ТекСтрокаУслугиИАбонементы Из УслугиИАбонементы Цикл
СуммаПоДокументу2 = СуммаПоДокументу2+ТекСтрокаУслугиИАбонементы.Сумма;
КонецЦикла;
Движение=Движения.Товарооборот.Добавить();
Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
Движение.Период=Дата;
Движение.Товар=ВыборкаДетальныеЗаписи.Товар;
Движение.Количество=ВыборкаДетальныеЗаписи.Количество;
Движение.Сумма= СуммаПоДокументу1+СуммаПоДокументу2;
КонецЦикла;
///////////////////////////////////////////////////////////
// регистр ПродажиКлиентам
Движения.ПродажиКлиентам.Записывать = Истина;
Для Каждого ТекСтрокаУслугиИАбонементы Из УслугиИАбонементы Цикл
Движение = Движения.ПродажиКлиентам.Добавить();
Движение.Период = Дата;
Движение.Товар = ТекСтрокаУслугиИАбонементы.Услуга;
Движение.Количесвто = ТекСтрокаУслугиИАбонементы.Количество;
Движение.Сумма = Сумма;
Движение.СуммаЕди = СуммаЕд;
Движение.Клиент = Клиент;
Движение.Сотрудник = Сотрудник;
КонецЦикла;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ПродажиКлиентам.Добавить();
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовары.Товар;
Движение.Количесвто = ТекСтрокаТовары.Количество;
Движение.Сумма = Сумма;
Движение.СуммаЕди = СуммаЕд;
Движение.Клиент = Клиент;
Движение.Сотрудник = Сотрудник;
КонецЦикла;
КонецПроцедуры
Показать&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
ДокументОбъект.Записать();
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
Иначе
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
Отказ=Истина;
КонецЕсли;
Иначе
АбонементОбъект=Абонемент();
Если АбонементОбъект=1 Тогда
Клиент=Объект.Клиент;
Абонемент=Объект.УслугиИАбонементы.Услуга;
КолвоЕдиниц =ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"КолвоЕд");
Срок=ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Срок");
ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
ИначеЕсли АбонементОбъект=2 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "У клиента отсутствует/не выбран абонемент, необходимо его приобрести/выбрать. ";
Сообщение.Сообщить();
Отказ=Истина;
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот