HELP
23.09.2009
08:11
#12
при считывания штрих сканером в Чек ККМ в колонке количество автоматически подставляется "0" а нужно "1"
23.09.2009
08:56
#13
Ищите в форме документа "Чек ККМ", а в ней процедуру "ОбработкаВнешнегоСобытия".
23.09.2009
09:02
#14
а дальше если можно распишите по подробней что и как делать очень нужно!!!!
заранее благадарю.
заранее благадарю.
23.09.2009
13:57
#16
"/////////////////////////////////////////////////////////// /////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
//
Перем СписокДействий; // для механизма кнопки "Действия"
Перем ТаблицаПечФорм; // список печатных форм документа
Перем НомерТекущейФормы;
Перем НачальнаяДатаДокумента; // для механизма контроля уникальности номеров
Перем СтараяСкидка;
Перем ТекущийДолг;
Перем ОбщРег, ОстаткиТМЦ, СписокПараметров;
// для выбора розничных цен, по которым есть остатки
Перем СтараяСумма, СтараяПолучено;
//////////////////////////////////////////////////// ////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
//
//******************************************************************************
// УправлениеВидимостью()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
//
// Описание:
// Управление видимостью элементов диалога.
//
Процедура УправлениеВидимостью()
Форма.СуммаСкидки.Видимость(Скидка.Выбран());
КонецПроцедуры // УправлениеВидимостью()
//******************************************************************************
// ОбновитьНадписи()
//
// Описание:
// Обновляет текст информационных надписей в форме документа
Процедура ОбновитьНадписи()
Форма.ТекстФирмы .Заголовок(глСтрокаФирмы (Контекст));
Форма.ТекстСклада .Заголовок(глСтрокаСклада (Склад));
КонецПроцедуры //ОбновитьНадписи()
//******************************************************************************
// ВывестиПолноеНаименованиеВалюты()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Строка - полное наименование валюты или строку "Валюта не задана"
//
// Вызывается из формул элементов диалога:
//
// Описание:
// Возвращает полное наименоавние валюты документа
//
Функция ВывестиПолноеНаименованиеВалюты()
Если ПустоеЗначение(Валюта) = 1 Тогда
Возврат "Валюта не задана";
Иначе
Возврат Валюта.ПолнНаименование;
КонецЕсли;
КонецФункции
//*****************************************************************************
// ЗаголовокФормы()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Название операции
//
// Описание:
// Формирует название операции и заголовок формы диалога
//
Функция ЗаголовокФормы()
Перем Заголовок, Название;
Заголовок = глНазваниеДОкументаВЖурнале(Контекст);
Название = Заголовок+" №";
Если Выбран() = 1 Тогда
Если Проведен() = 1 Тогда
Заголовок = Заголовок + ". Проведен";
Иначе
Заголовок = Заголовок + ". Не проведен";
КонецЕсли;
Иначе
Заголовок = Заголовок + ". Новый";
КонецЕсли;
Форма.Заголовок(Заголовок);
Возврат Название;
КонецФункции // ЗаголовокФормы
//******************************************************************************
// ПоКнопкеПодбор()
//
// Параметры:
// нет.
// Возвращаемое значение:
// нет.
// Описание:
Процедура ПоКнопкеПодбор()
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(Фирма, "Фирма");
Параметры.ДобавитьЗначение(Склад, "Склад");
Параметры.ДобавитьЗначение(0, "ЕстьВидТМЦ");
Параметры.ДобавитьЗначение(Валюта, "Валюта");
Параметры.ДобавитьЗначение(Курс, "Курс");
Параметры.ДобавитьЗначение(Кратность, "Кратность");
Если Склад.РозничныйСклад = 0 Тогда
Параметры.ДобавитьЗначение("ИзСправочника", "ЦенаВподборе");
Параметры.ДобавитьЗначение(глЗначениеПоУмолчанию("ОсновнойТипЦенПродажи"), "ТипЦен");
Иначе
Параметры.ДобавитьЗначение("Розница", "ЦенаВподборе");
КонецЕсли;
Если Выбран() = 0 Тогда
Параметры.ДобавитьЗначение("Дата", "ТипГраницы");
Параметры.ДобавитьЗначение(ДатаДок, "ЗначениеГраницы");
Иначе
Параметры.ДобавитьЗначение("Позиция", "ТипГраницы");
Параметры.ДобавитьЗначение(ПолучитьПозицию(), "ЗначениеГраницы");
КонецЕсли;
Параметры.ДобавитьЗначение("Подбор номенклатуры в документ " + ПредставлениеВида() + " № " + НомерДок, "Заголовок");
глПодбор(Контекст, Параметры);
КонецПроцедуры // ПоКнопкеПодбор()
//******************************************************************************
// Печать(СразуНаПринтер, КолЭкз)
//
// Параметры:
// СразуНаПринтер - (1) если печать на принтер, (0) - с предварительным просмотром
// КолЭкз - количество экземпляров печати
//
// Возвращаемое значение:
// нет.
//
// Описание:
//
Процедура Печать(СразуНаПринтер = 0,КолЭкз = 1)
Перем ПечТаблица, ВысотаШапки;
ПечТаблица = СоздатьОбъект("Таблица");
// выводим шапку документа
ПечТаблица.ВывестиСекцию("Шапка");
// шапку повторяем на каждой странице
ВысотаШапки = ПечТаблица.ВысотаСекции("Шапка");
ПечТаблица.ПовторятьПриПечатиСтроки(1, ВысотаШапки);
// выводим товары
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ПечТаблица.ВывестиСекцию("Строка");
КонецЦикла;
// выводим подвал
ПечТаблица.ВывестиСекцию("Подвал");
Если СразуНаПринтер = 0 Тогда
// покажем результирующую таблицу
ПечТаблица.Опции(0, 0, ВысотаШапки, 0, "ПараметрыПечатиЧека", "ПараметрыПечатиЧека");
Если глПолучитьПолномочие("РазрешитьРедактированиеТаблиц") = 0 Тогда
ПечТаблица.Защита(1);
Иначе
ПечТаблица.Защита(0);
КонецЕсли;
ПечТаблица.ТолькоПросмотр(1);
ПечТаблица.Показать(глНазваниеДокументаВжурнале(Контекст),"""");
Иначе
ПечТаблица.ПараметрыСтраницы(,,,,,,,,,1,,);
ПечТаблица.КоличествоЭкземпляров(КолЭкз);
ПечТаблица.Напечатать(0);
КонецЕсли;
КонецПроцедуры // Печать()
//******************************************************************************
// ПоКнопкеПечать()
//
// Параметры:
// Нет
//
// Описание:
// Вызывается по кнопке "Печать"
//
Процедура ПоКнопкеПечать(СразуНаПринтер = 0,КолЭкз = 1)
// проверим полномочия печати непроведенных документов
Если (Проведен()=0)
Или ((Проведен()=1) И (Модифицированность()=1)) Тогда
Если глПолучитьПолномочие("РазрешитьПечатьНепроведенныхДокументов") = 0 Тогда
Предупреждение("Недостаточно полномочий для печати непроведенного документа!", 60);
Возврат;
КонецЕсли;
КонецЕсли;
Если ПустоеЗначение(НомерТекущейФормы) = 1 Тогда
НомерТекущейФормы = 1;
Форма.кнПечать.Заголовок(ТаблицаПечФорм.ПолучитьЗначение(НомерТекущейФормы, "Кнопка"));
КонецЕсли;
Если НомерТекущейФормы = 1 Тогда
Печать(СразуНаПринтер, КолЭкз);
Иначе
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(глВзятьКонтекст(Контекст), "Контекст");
Параметры.ДобавитьЗначение(СразуНаПринтер, "Устройство");
Параметры.ДобавитьЗначение(КолЭкз, "КоличествоКопий");
ОткрытьФорму("Отчет", Параметры, глКаталогПечФорм+ТаблицаПечФорм.ПолучитьЗначение(НомерТекущейФормы,"Файл"));
КонецЕсли;
КонецПроцедуры // ПоКнопкеПечать()
//******************************************************************************
// ПоКнопкеВыборПечатнойФормы()
//
// Параметры:
// нет.
//
// Возвращаемое значение:
// нет.
//
// Описание:
// - открывает список для выбора способа печати.
// - формирует таблицу по выбранному способу.
//
Процедура ПоКнопкеВыборПечатнойФормы()
ВыбНомер = глВыборПечатнойФормы("Документ." + Вид(), ТаблицаПечФорм);
Если ВыбНомер > 0 Тогда
НомерТекущейФормы = ВыбНомер;
Форма.кнПечать.Заголовок(ТаблицаПечФорм.ПолучитьЗначение(НомерТекущейФормы, "Кнопка"));
ПоКнопкеПечать();
КонецЕсли;
КонецПроцедуры // ПоКнопкеВыборПечатнойФормы()
//******************************************************************************
// ПриИзмененииСкидки()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
// Поле "Скидка".
//
// Описание:
// Если изменилась скидка - пересчитываем суммы.
//
Процедура ПриИзмененииСкидки()
Если СтараяСкидка<>Скидка Тогда
глПересчитатьСкидки(Контекст);
СтараяСкидка = Скидка;
КонецЕсли;
УправлениеВидимостью();
КонецПроцедуры // ПриИзмененииСкидки()
// *****************************************************************************
// ПолучитьТовар()
//
// Параметры:
// ШтрихКод - код/штрих-код искомого товара
// ВремТовар - возвращаемый товар
// ВремЕдиница - возвращаемая единица измерения
//
// Возвращаемое значение:
// 1 - товар найден, иначе 0
//
// Вызывается из:
// процедуры ПриИзмененииШтрихКода().
//
// Описание:
// Ищет товар по преданному штрих-коду/коду.
//
Функция ПолучитьТовар(ШтрихКод,ВремТовар,ВремЕдиница)
Рез = 0;
СпрЕдиницы = СоздатьОбъект("Справочник.Единицы");
СпрТовар = СоздатьОбъект("Справочник.Номенклатура");
Если СпрЕдиницы.НайтиПоРеквизиту("Штрихкод", ШтрихКод, 1) = 1 Тогда
ВремТовар = СпрЕдиницы.Владелец;
ВремЕдиница = СпрЕдиницы.ТекущийЭлемент();
Рез = 1;
ИначеЕсли СпрТовар.НайтиПоКоду(ШтрихКод,0) = 1 Тогда
ВремТовар = СпрТовар.ТекущийЭлемент();
ВремЕдиница = СпрТовар.БазоваяЕдиница;
Рез = 1;
Иначе
ВремКод = ШтрихКод;
Пока СтрДлина(ВремКод)<8 Цикл
ВремКод = глДополнитьСтрокуЛ(ВремКод, "0", СтрДлина(ВремКод)+1);
Если СпрТовар.НайтиПоКоду(ВремКод,0) = 1 Тогда
ВремТовар = СпрТовар.ТекущийЭлемент();
ВремЕдиница = СпрТовар.БазоваяЕдиница;
Рез = 1;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Рез;
КонецФункции // ПолучитьТовар()
//******************************************************************************
// ПриИзмененииШтрихКода()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
// Штрих - код.
//
// Описание:
// При изменении штрих - кода надо найти товар по введенному коду.
//
Процедура ПриИзмененииШтрихКода()
Перем ВремТовар,ВремЕдиница;
Если ПустоеЗначение(ШтрихКод)=0 Тогда
Если ПолучитьТовар(СокрЛП(ШтрихКод), ВремТовар, ВремЕдиница) = 1 Тогда
Номенклатура = ВремТовар;
Единица = ВремЕдиница;
Коэффициент = Единица.Коэффициент;
Если глПересчетРегистров(Контекст, СписокПараметров) = 0 Тогда
Возврат;
КонецЕсли;
ТовЦена = """";
Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа)
или (Склад.РозничныйСклад = 0) Тогда
Цена = глПолучитьЦену(Номенклатура, Константа.РозничныйТипЦен, ДатаДок, Единица, Валюта, Курс, Кратность);
Иначе // цена из остатков регистра
глПолучитьРозничныйОстатокЦену(Номенклатура, Единица, ОстаткиТМЦ, , ТовЦена);
СписокЦен = ЗначениеИзСтроки(ТовЦена);
Если СписокЦен.РазмерСписка() = 0 Тогда
Цена = 0;
Иначе
Цена = СписокЦен.ПолучитьЗначение(1);
КонецЕсли;
КонецЕсли;
глПересчетТаблЧасти(Контекст,"Единица"); // пересчитаем от выбранной единицы
Форма.Номенклатура.Доступность(1);
Форма.Количество.Доступность(1);
Иначе
Предупреждение("Товар со штрих-кодом "+СокрЛП(ШтрихКод)+" не найден!", 60);
Форма.Номенклатура.Доступность(0);
Форма.Количество.Доступность(0);
КонецЕсли;
Иначе
Форма.Номенклатура.Доступность(1);
Форма.Количество.Доступность(1);
КонецЕсли;
КонецПроцедуры // ПриИзмененииШтрихКода()
//******************************************************************************
// ПриИзмененииНоменклатуры()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога
// Колонка "Номенклатура" спецификации документа
//
// Описание:
// Производит необходимые действия при смене позиции номенклатуры в строке документа.
//
Процедура ПриИзмененииНоменклатуры()
Перем ВремКоэфф, ВремЦена, НоваяНоменклатура;
Перем ЦенаЦены, ЕдЦены, ВалютаЦены, ТипЦен;
Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа)
или (Склад.РозничныйСклад = 0) Тогда
// Процедуру "глПересчетТаблЧасти" не вызываем т.к. необходимо заполнить цену из справочника,
// а реквизита шапки "ТипЦен" в этом документе нет.
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Единица = 0;
Коэффициент = 0;
Цена = 0;
Количество = 0;
Сумма = 0;
Возврат;
КонецЕсли;
НоваяНоменклатура = 0;
Если ПустоеЗначение(Единица) = 1 Тогда
НоваяНоменклатура = 1;
ИначеЕсли Номенклатура <> Единица.Владелец Тогда
НоваяНоменклатура = 1;
КонецЕсли;
Если НоваяНоменклатура = 0 Тогда
Возврат;
КонецЕсли;
Если Номенклатура <> Номенклатура.ОсновнаяЕдиница.Владелец Тогда
Предупреждение("Для позиции номенклатуры """"" + СокрЛП(Номенклатура) +
""""" указана основная единица измерения, принадлежащая другому элементу справочника Номенклатура.", 60);
Возврат;
КонецЕсли;
Единица = Номенклатура.ОсновнаяЕдиница;
Коэффициент = Единица.Коэффициент;
ТипЦен = Константа.РозничныйТипЦен;
Если ПустоеЗначение(ТипЦен) = 1 Тогда
Возврат;
КонецЕсли;
Если глВернутьЦену(Номенклатура, ТипЦен, ДатаДок, ЦенаЦены, ЕдЦены, ВалютаЦены) <> 1 Тогда
Возврат; // для товара цены нет
КонецЕсли;
Единица = ЕдЦены;
Коэффициент = ЕдЦены.Коэффициент;
глПересчитатьЦенуВДокументе(Контекст, 0, 0, ЦенаЦены, ВалютаЦены,
ТипЦен.ЦенаВклНП, ТипЦен.ЦенаВклНДС);
Сумма = Цена * Количество * (1 - Скидка.Процент / 100);
Иначе
глПересчетТаблЧасти(Контекст, Форма.ТекущаяКолонка(), СписокПараметров);
КонецЕсли;
ШтрихКод = Единица.ШтрихКод;
// для услуг и работ цены можно редактировать, иначе нужно выбирать из остатков регистра
Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа)
или (Склад.РозничныйСклад = 0) Тогда
Форма.Цена.Редактирование(1);
Иначе
Форма.Цена.Редактирование(0);
КонецЕсли;
КонецПроцедуры // ПриИзмененииНоменклатуры()
//******************************************************************************
// РасчетСдачи()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Сумма сдачи
//
// Вызывается из формул элементов диалога:
// Надпись "Сдача".
//
// Описание:
// Вычисляет сумму сдачи.
//
Функция РасчетСдачи()
ВремСумма = Итог("Сумма");
ВремСдача = Макс(Получено - ВремСумма, 0);
Если (СтараяСумма <> ВремСумма) ИЛИ (СтараяПолучено <> Получено) Тогда
СтараяСумма = ВремСумма;
СтараяПолучено = Получено;
Попытка
глДПВывестиСтроки(глФРМ(ВремСумма,,""""), глФРМ(ВремСдача,,""""));
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Возврат (глФРМ(ВремСдача));
КонецФункции // РасчетСдачи()
//******************************************************************************
// ЗаполнениеПоДокументуОснованию()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
//
// Описание:
// Производит заполнение документа по документу - основанию.
//
Функция ЗаполнениеПоДокументуОснованию()
Если ДокОснование.Выбран()=0 Тогда
Возврат "Документ - основание не выбран!";
КонецЕсли;
ВидОсн = ДокОснование.Вид();
Если (ВидОсн <> "ЧекККМ") Тогда
Возврат "Неверный вид документа - основания!";
КонецЕсли; // вид ДокОснования
Если ДокОснование.ВидОперации = Перечисление.ВидыОперацийЧекККМ.ЧекНаВозврат Тогда
Возврат "На основании документа """"Чек на возврат"""" нельзя вводить документы !";
КонецЕсли;
ТаблицаДокумента = СоздатьОбъект("ТаблицаЗначений");
ДокОснование.ВыгрузитьТабличнуюЧасть(ТаблицаДокумента);
// очищаем наш документ
УдалитьСтроки();
ТаблицаДокумента.ВыбратьСтроки();
Пока ТаблицаДокумента.ПолучитьСтроку()=1 Цикл
ВремНоменклатура = ТаблицаДокумента.Номенклатура;
НоваяСтрока();
Штрихкод = ТаблицаДокумента.Штрихкод;
Номенклатура= ТаблицаДокумента.Номенклатура;
Количество = ТаблицаДокумента.Количество;
Единица = ТаблицаДокумента.Единица;
Коэффициент = ТаблицаДокумента.Коэффициент;
Цена = глПересчет(ТаблицаДокумента.Цена,
ДокОснование.Валюта,
ДокОснование.Курс,
Валюта,
Курс,
ДокОснование.Кратность,
Кратность);
ВремСумма = (Цена * Количество);
Сумма = ВремСумма - ВремСумма * Скидка.Процент / 100;
КонецЦикла; // по строкам основания
Если КоличествоСтрок() = 0 Тогда
Возврат "В документе основании не заполнена табличная часть";
КонецЕсли;
Возврат """";
КонецФункции // ЗаполнениеПоДокументуОснованию()
//*****************************************************************************
// ПоКнопкеОснование()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Описание:
// Вызывается по кнопке выбора документа основания
//
Процедура ПоКнопкеОснование()
Перем Основание;
// если документ основание уже есть, откроем его
Если ПустоеЗначение(ДокОснование) = 0 Тогда
ОткрытьФорму(ДокОснование);
Возврат;
КонецЕсли;
// если документа - основания нет, позволяем выбрать его
Основание = глВыбратьОснование(Контекст);
Если ПустоеЗначение(Основание) = 0 Тогда
// Выбрали основание
глЗаполнитьШапкуНаОсн(Контекст,Основание);
ТекстВопроса = "Заполнить по документу основанию?";
Если КоличествоСтрок() <> 0 Тогда
ТекстВопроса = ТекстВопроса + РазделительСтрок +" (перед заполнением табличная часть будет очищена)";
КонецЕсли;
Если Вопрос(ТекстВопроса, "Да+Нет", 60) <> "Да" Тогда
Возврат;
КонецЕсли;
УдалитьСтроки();
Результат = ЗаполнениеПоДокументуОснованию();
Если ПустоеЗначение(Результат) = 0 Тогда
Предупреждение(Результат, 60);
КонецЕсли;
КонецЕсли;
КонецПроцедуры //ПоКнопкеОснование()
//******************************************************************************
Функция ПробитьЧекНаККМ()
Перем НомерЧека;
СписокТоваров = СоздатьОбъект("ТаблицаЗначений");
СписокТоваров.НоваяКолонка("ТовНаим" , "Строка");
СписокТоваров.НоваяКолонка("Цена" , "Число");
СписокТоваров.НоваяКолонка("Количество", "Число");
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
СписокТоваров.НоваяСтрока();
СписокТоваров.ТовНаим = Номенклатура.Наименование;
СписокТоваров.Цена = Цена;
СписокТоваров.Количество = Количество;
КонецЦикла;
ПризнВозврата = ?(ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек, 0, 1);
ЧекПробитККМ = глФРПечататьЧек(СписокТоваров, Итог("Сумма"), ?(Получено=0,Итог("Сумма"),Получено), Скидка.Процент, ПризнВозврата, Склад.НомерСекции, НомерЧека);
Если ЧекПробитККМ = 1 Тогда
ПриЗаписиПерепроводить(0);
НомерЧекаККМ = НомерЧека;
Записать();
ПриЗаписиПерепроводить(1);
// Откроем денежный ящик, если он подключен
глДПОткрытьДенежныйЯщик();
КонецЕсли;
Возврат ЧекПробитККМ;
КонецФункции // ПробитьЧекНаККМ()
//******************************************************************************
//
//
Процедура ВыполнитьНажатиеНаКнопку(ИмяКнопки)
Если ИмяКнопки="Записать" Тогда
Записать();
ИначеЕсли ИмяКнопки="Провести" Тогда
БылПроведен=Проведен();
Если Записать()=1 Тогда
// если документ был проведен, то при записи он перепроведется
// и поэтому нет необходимости его снова проводить
Если БылПроведен=0 Тогда
Если ПравоДоступа("ПроведениеДокумента", "Документ.ЧекККМ") = 1 Тогда
Провести();
Иначе
Предупреждение("Недостаточно прав доступа!");
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли ИмяКнопки="ОК" Тогда
БылПроведен=Проведен();
Если Записать()=1 Тогда
// если документ был проведен, то при записи он перепроведется
// и поэтому нет необходимости его снова проводить
Если БылПроведен=0 Тогда
Если ПравоДоступа("ПроведениеДокумента", "Документ.ЧекККМ") = 1 Тогда
Если Провести()=0 Тогда
Возврат;
КонецЕсли;
Иначе
Предупреждение("Недостаточно прав доступа!");
КонецЕсли;
КонецЕсли;
Иначе
Возврат;
КонецЕсли;
КонецЕсли;
Если Проведен()=1 Тогда
// пробьем чек на ККМ
Если Касса.РежимККМ = Перечисление.РежимыККМ.ФР Тогда
Если глФРВкл = 1 Тогда
Если ЧекПробитККМ = 0 Тогда
Если ПробитьЧекНаККМ() = 0 Тогда
// по каким-то причинам Чек не пробит
Сообщить("Чек ККМ не пробит!");
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ИмяКнопки="ОК" Тогда
Форма.Закрыть(1);
КонецЕсли;
КонецПроцедуры
////////////////////////////////// ////////////////////////////////////////////////
// ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ
//
//******************************************************************************
// предопределенная процедура
//
Процедура ВводНового(Скопирован)
АвтоВремяПослеТА();
глЗаполнитьШапку(Контекст, Скопирован);
Если Скопирован = 1 Тогда // если скопирован, то надо очистить реквизиты
ЧекПробитККМ = 0;
НомерЧекаККМ = 0;
Возврат;
КонецЕсли;
Если ПустоеЗначение(Касса) = 1 Тогда
Касса = глЗначениеПоУмолчанию("ОсновнаяКасса");
КонецЕсли;
Если ПустоеЗначение(Касса) = 1 Тогда
Предупреждение("Для текущего пользователя не настроена касса по умолчанию.
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
Если (Касса.РежимККМ = Перечисление.РежимыККМ.OffLine) ИЛИ (Касса.РежимККМ = Перечисление.РежимыККМ.OnLine) Тогда
// Для режимов OffLine и OnLine выписка чека не имеет смысла, т.к. чек
// пробивается в кассе
Предупреждение("Для ККМ с режимом работы OffLine или OnLine
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
Если ПустоеЗначение(Фирма) = 1 Тогда
Предупреждение("Для текущего пользователя не настроена фирма по умолчанию.
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
Если ПустоеЗначение(Склад) = 1 Тогда
Предупреждение("Для текущего пользователя не настроен склад по умолчанию.
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек;
КонецПроцедуры // ВводНового()
//******************************************************************************
// предопределенная процедура
//
Процедура ВводНаОсновании(ДокументОснование)
Касса = ДокументОснование.Касса;
Если (Касса.РежимККМ = Перечисление.РежимыККМ.OffLine) ИЛИ (Касса.РежимККМ = Перечисление.РежимыККМ.OnLine) Тогда
// Для режимов OffLine и OnLine выписка чека не имеет смысла, т.к. чек
// пробивается в кассе
Предупреждение("Для ККМ с режимом работы OffLine или OnLine
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
СинонимДокумента = ПредставлениеВида();
СинонимОснования = ДокументОснование.ПредставлениеВида();
Список = глПолучитьСписокВводимыхНаОсновании(ДокументОснование);
Поз = Список.НайтиЗначение(Вид());
// выполним проверку, можно ли вводить документ на основании ДокументОснование
Если Поз = 0 Тогда
// ДокументОснование не найден в списке разрешенных
Предупреждение("Документ """"" + СинонимДокумента +
""""" нельзя вводить на основании """"" + СинонимОснования + """", 60);
СтатусВозврата(0);
Возврат;
КонецЕсли;
// чек вводится только на основании другого чека,
// поэтому он всегда является "чеком на возврат"
ВидОперации = Перечисление.ВидыОперацийЧекККМ.ЧекНаВозврат;
глЗаполнитьШапкуНаОсн(Контекст,ДокументОснование);
Результат = ЗаполнениеПоДокументуОснованию();
Если ПустоеЗначение(Результат) = 0 Тогда
Сообщить(Результат);
СтатусВозврата(0);
КонецЕсли;
КонецПроцедуры // ВводНаОсновании()
//******************************************************************************
// предопределенная процедура
//
Процедура ПриОткрытии()
// Заполним таблицу для выбора печатной формы
НомерТекущейФормы = глУстановкаКнопкиПечать(Контекст, "Документ." + Вид(),ТаблицаПечФорм);
Парам = Форма.Параметр;
Если ТипЗначенияСтр(Парам)="СписокЗначений" Тогда
Если ПустоеЗначение(Парам.Получить("Команда"))=1 Тогда
Сообщить("В форму документа "+Вид()+" передан неверный параметр!","I");
СтатусВозврата(0);Возврат;
КонецЕсли;
Если Парам.Получить("Команда") = "ПечатьНаПринтер" Тогда
КолЭкз = Макс(Число(Парам.Получить("КолЭкз")),1);
ПоКнопкеПечать(1,КолЭкз);
СтатусВозврата(0);Возврат;
ИначеЕсли Парам.Получить("Команда") = "ПечатьНаЭкран" Тогда
ПоКнопкеПечать(0);
СтатусВозврата(0);Возврат;
Иначе
Сообщить("В форму документа "+Вид()+" передана неверная команда "+Парам.Получить("Команда")+"!","I");
СтатусВозврата(0);Возврат;
КонецЕсли;
КонецЕсли;
// инициализация модульных переменных, контролирующих выполнение
// пересчетов и обновление надписей в форме
НачальнаяДатаДокумента = ДатаДок;
СтараяСкидка = Скидка;
Форма.ШтрихКод .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Номенклатура .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Единица .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Количество .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Цена .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Сумма .ВыполнятьФормулуТолькоПриИзменении(1);
глПроверкаРазрешенияРедактирования(Контекст);
Если Склад.РозничныйСклад = 1 Тогда
// на розн.складе всем разрашаем выбирать цену из списка
Форма.Цена.Доступность(1);
Форма.Цена.Редактирование(0);
КонецЕсли;
// если дата проведенного документа больше ТА, то открываем только на просмотр,
// так как его все равно не удастся сохранить после редактирования.
Если (Проведен() = 1) И (ДатаДок > ПолучитьДатуТА()) Тогда
Форма.ТолькоПросмотр(1);
КонецЕсли;
//Инициализирум список действий по кнопке "Действия"
СписокДействий = СоздатьОбъект("СписокЗначений");
СписокДействий.ДобавитьЗначение("Отчет о движениях документа");
СписокДействий.ДобавитьЗначение("Структура подчиненности");
// Если открыли только на просмотр, то надо кнопки сделать недоступными
Если Форма.ТолькоПросмотр()=1 Тогда
// СДЕЛАТЬ НЕДОСТУПНЫМИ КНОПКИ МОДИФИКАЦИИ ДОКУМЕНТА
Форма.кнОК.Доступность(0);
Форма.кнЗаписать.Доступность(0);
Форма.кнПровести.Доступность(0);
Форма.кнПодбор.Доступность(0);
КонецЕсли;
СписокДействий.ДобавитьЗначение("Ввести на основании");
СписокДействий.ДобавитьЗначение("Перейти в журнал");
// кнопка по умолчанию
Если (Форма.ТолькоПросмотр() = 1) ИЛИ ((ДатаДок < Макс(РабочаяДата(), ПолучитьДатуТА()) ) И (Выбран() = 1)) Тогда
Форма.КнопкаПоУмолчанию("кнЗакрыть");
Иначе
Форма.КнопкаПоУмолчанию("кнОК");
КонецЕсли;
ОбновитьНадписи();
УправлениеВидимостью();
глДПВключитьРежимВыводаСтрок();
//Если документ еще не проведен, тогда
//проведение делаем только в потоке
Если ( Проведен() = 0 ) Тогда
ПроводитьПослеТА(1,1);
КонецЕсли;
КонецПроцедуры // ПриОткрытии()
//******************************************************************************
// Предопределенная процедура
//
Процедура ПриНачалеРедактированияСтроки()
Форма.Номенклатура.Доступность(1);
Форма.Количество.Доступность(1);
// для услуг и работ цены можно редактировать, иначе нужно выбирать из остатков регистра
Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа)
или (Склад.РозничныйСклад = 0) Тогда
Форма.Цена.Редактирование(глПолучитьПолномочие("РазрешитьРедактированиеЦенВдокументах"));
Иначе
Форма.Цена.Редактирование(0);
КонецЕсли;
Если Форма.ТекущаяКолонка() = "Цена" Тогда
Если (Форма.ПолучитьАтрибут(Форма.ТекущаяКолонка()).Доступность() = 0)
И (глПолучитьПолномочие("РазрешитьРедактированиеЦенВдокументах") = 0)
И (ПустоеЗначение(Склад.РозничныйСклад) = 1)
Тогда
Предупреждение("Редактирование цен запрещено в соответствии
|с установленными полномочиями пользователя!", 60);
КонецЕсли;
ИначеЕсли (Форма.ТекущаяКолонка() = "Сумма" )
или (Форма.ТекущаяКолонка() = "СуммаНП" )
или (Форма.ТекущаяКолонка() = "СуммаНДС")
Тогда
Если (Форма.ПолучитьАтрибут(Форма.ТекущаяКолонка()).Доступность() = 0)
И (глПолучитьПолномочие("РазрешитьРедактированиеЦенВдокументах") = 0)
Тогда
Предупреждение("Редактирование цен запрещено в соответствии
|с установленными полномочиями пользователя!", 60);
КонецЕсли;
КонецЕсли;
КонецПроцедуры //ПриНачалеРедактированияСтроки()
//******************************************************************************
// Предопределенная процедура.
//
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
Если ИдентЭлемДиалога = "Цена" Тогда
Если (Склад.РозничныйСклад = 1)
и (Номенклатура.ВидНоменклатуры <> Перечисление.ВидыНоменклатуры.Услуга)
и (Номенклатура.ВидНоменклатуры <> Перечисление.ВидыНоменклатуры.Работа) Тогда
ФлагСтандОбр = 0;
// регистры рассчитываем, только если хочется редактировать цены вручную
Если глПересчетРегистров(Контекст, СписокПараметров) = 0 Тогда
Возврат;
КонецЕсли;
ТовЦена = """";
глПолучитьРозничныйОстатокЦену(Номенклатура, Единица, ОстаткиТМЦ, , ТовЦена);
СписокЦен = ЗначениеИзСтроки(ТовЦена);
СписокЦен.ВыбратьЗначение(Цена, , , 60,2);
глПересчетТаблЧасти(Контекст,"Цена");
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ПриНачалеВыбораЗначения()
//******************************************************************************
//Предопределенная процедура
//
Процедура ПриРедактированииНовойСтроки()
Форма.Номенклатура.Доступность(1);
Форма.Количество.Доступность(1);
КонецПроцедуры // ПриРедактированииНовойСтроки()
//******************************************************************************
//Предопределенная процедура
//
Процедура ПриЗаписи()
Если глМожноЗаписатьДокумент(Контекст)=0 Тогда
СтатусВозврата(0);
ИначеЕсли глКонтрольДатыДокумента(Контекст, НачальнаяДатаДокумента)=1 Тогда
СтатусВозврата(0);
КонецЕсли;
КонецПроцедуры // ПриЗаписи()
//******************************************************************************
//Предопределенная процедура
//
Процедура ПриЗакрытии()
глДПВключитьРежимВыводаБегСтроки();
КонецПроцедуры // ПриЗаписи()
//******************************************************************************
// Предопределенная процедура
//
Процедура ОбработкаПодбора(ВыбЗнач, КонтФормыПодбора)
// нет ставок налогов, есть скидка
глОбработкаПодбора(Контекст, ВыбЗнач, 0, 0, 1);
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ШтрихКод = Единица.ШтрихКод; // прописываем штрих - код
КонецЦикла;
КонецПроцедуры // ОбработкаПодбора()
//******************************************************************************
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
// Процедура разбирает штрих-код, считанный сканером
// и заполняет строки накладной
Перем Упаковка,ТекКоличество, Спецификация;
Перем ВремТовар, ВремЕдиница, ВремКоличество, ВремЦена;
Перем СтрокаВозврЦена;
Если Событие = "BarCodeValue" Тогда
Если Форма.ТолькоПросмотр() = 0 Тогда
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Если НомерСтроки > 0 Тогда
УдалитьСтроку();
КонецЕсли;
КонецЕсли;
Если глПолучитьТоварПоШтрихкоду(Данные, ВремТовар, ВремЕдиница, ВремКоличество) <> 0 Тогда
ТаблицаПодбора = СоздатьОбъект("ТаблицаЗначений");
ТаблицаПодбора.НоваяКолонка("Номенклатура");
ТаблицаПодбора.НоваяКолонка("Единица");
ТаблицаПодбора.НоваяКолонка("Количество", "Число");
ТаблицаПодбора.НоваяКолонка("Цена", "Число");
ТаблицаПодбора.НоваяСтрока();
ТаблицаПодбора.Номенклатура = ВремТовар;
ТаблицаПодбора.Единица = ВремЕдиница;
ТаблицаПодбора.Количество = ВремКоличество;
ПараметрыПодбора = СоздатьОбъект("СписокЗначений");
ПараметрыПодбора.ДобавитьЗначение(0, "ЕстьВидТМЦ");
Если (ВремТовар.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (ВремТовар.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа) Тогда
ТаблицаПодбора.Цена = глПолучитьЦену(ВремТовар, Константа.РозничныйТипЦен, ДатаДок, ВремЕдиница, Валюта, Курс, Кратность);
ПараметрыПодбора.ДобавитьЗначение("ИзСправочника" , "ЦенаВподборе");
ПараметрыПодбора.ДобавитьЗначение(Константа.РозничныйТипЦен, "ТипЦен");
ИначеЕсли Склад.РозничныйСклад = 0 Тогда
ТаблицаПодбора.Цена = глПолучитьЦену(ВремТовар, глЗначениеПоУмолчанию("ОсновнойТипЦенПродажи"), ДатаДок, ВремЕдиница, Валюта, Курс, Кратность);
ПараметрыПодбора.ДобавитьЗначение("ИзСправочника", "ЦенаВподборе");
ПараметрыПодбора.ДобавитьЗначение(глЗначениеПоУмолчанию("ОсновнойТипЦенПродажи"), "ТипЦен");
Иначе // цена из остатков регистра
ТовОстатки = СоздатьОбъект("Регистр.ОстаткиТМЦ");
ФирмаДляОстатковТМЦ = глФирмаДляОстатковТМЦ(Фирма);
ТовОстатки.УстановитьЗначениеФильтра("Фирма", ФирмаДляОстатковТМЦ, 2);
ТовОстатки.УстановитьЗначениеФильтра("Склад", Склад, 1);
глПолучитьРозничныйОстатокЦену(ВремТовар, ВремЕдиница, ТовОстатки, , СтрокаВозврЦена);
СписВозврЦен = ЗначениеИзстроки(СтрокаВозврЦена);
Если СписВозврЦен.РазмерСписка() = 1 Тогда
ТаблицаПодбора.Цена = глПересчет(СписВозврЦен.ПолучитьЗначение(1), глРубли, ДатаДок, Валюта, Курс,, Кратность);
ИначеЕсли СписВозврЦен.РазмерСписка() > 1 Тогда
Если СписВозврЦен.ВыбратьЗначение(ВремЦена,"Выберите цену для товара " + ВремТовар.Наименование, , 60) = 1 Тогда
ТаблицаПодбора.Цена = глПересчет(ВремЦена, глРубли, ДатаДок, Валюта, Курс,, Кратность);
Иначе
ТаблицаПодбора.Цена = 0;
КонецЕсли;
Иначе
ТаблицаПодбора.Цена = 0;
КонецЕсли;
ПараметрыПодбора.ДобавитьЗначение("Розница", "ЦенаВподборе");
КонецЕсли;
ПараметрыПодбора.ДобавитьЗначение(ТаблицаПодбора , "ТаблицаПодбора");
глОбработкаПодбора(Контекст, ПараметрыПодбора, 0, 0, 1);
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ШтрихКод = Единица.ШтрихКод; // прописываем штрих - код
КонецЦикла;
КонецЕсли;
КонецЕсли;
// Обработка закончена. Готовы к получению нового штрихкода.
глСканерПосылкаДанных(1);
Иначе
глОбработкаВнешнегоСобытия(Источник, Событие, Данные);
КонецЕсли;
КонецПроцедуры // ОбработкаВнешнегоСобытия()
//////////////////////////////////////////////////// ////////////////////////////
// ТЕЛО МОДУЛЯ ФОРМЫ
//
НомерТекущейФормы = 0;
ТаблицаПечФорм = СоздатьОбъект("ТаблицаЗначений");
ТаблицаПечФорм.НоваяКолонка("Название","Строка",,,,30);
ТаблицаПечФорм.НоваяКолонка("Файл","Строка",,,"Файл",10);
ТаблицаПечФорм.НоваяКолонка("Кнопка","Строка",,,,10);
ТаблицаПечФорм.НоваяКолонка("ФайлОписания","Строка");
// добавим информацию о встроенной форме
ТаблицаПечФорм.НоваяСтрока();
ТаблицаПечФорм.Название = "Печатная форма товарного чека";
ТаблицаПечФорм.Кнопка = "Чек";
// Для выбора цен
ОбщРег = СоздатьОбъект("Регистры");
ОстаткиТМЦ = ОбщРег.ОстаткиТМЦ;
СписокПараметров = СоздатьОбъект("СписокЗначений");
СписокПараметров.Установить("ОбщРег" , ОбщРег);
СписокПараметров.Установить("ОстаткиТМЦ" , ОстаткиТМЦ);
СписокПараметров.Установить("ФильтрПоСкладу" , ПолучитьПустоеЗначение("Справочник.Склады"));
СписокПараметров.Установить("ФильтрПоФирме" , ПолучитьПустоеЗначение("Справочник.Фирмы"));
СписокПараметров.Установить("ПозицияРегистра" , 0);
СтараяСумма = -1; СтараяПолучено = -1;"
// ПЕРЕМЕННЫЕ МОДУЛЯ
//
Перем СписокДействий; // для механизма кнопки "Действия"
Перем ТаблицаПечФорм; // список печатных форм документа
Перем НомерТекущейФормы;
Перем НачальнаяДатаДокумента; // для механизма контроля уникальности номеров
Перем СтараяСкидка;
Перем ТекущийДолг;
Перем ОбщРег, ОстаткиТМЦ, СписокПараметров;
// для выбора розничных цен, по которым есть остатки
Перем СтараяСумма, СтараяПолучено;
////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
//
//******************************************************************************
// УправлениеВидимостью()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
//
// Описание:
// Управление видимостью элементов диалога.
//
Процедура УправлениеВидимостью()
Форма.СуммаСкидки.Видимость(Скидка.Выбран());
КонецПроцедуры // УправлениеВидимостью()
//******************************************************************************
// ОбновитьНадписи()
//
// Описание:
// Обновляет текст информационных надписей в форме документа
Процедура ОбновитьНадписи()
Форма.ТекстФирмы .Заголовок(глСтрокаФирмы (Контекст));
Форма.ТекстСклада .Заголовок(глСтрокаСклада (Склад));
КонецПроцедуры //ОбновитьНадписи()
//******************************************************************************
// ВывестиПолноеНаименованиеВалюты()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Строка - полное наименование валюты или строку "Валюта не задана"
//
// Вызывается из формул элементов диалога:
//
// Описание:
// Возвращает полное наименоавние валюты документа
//
Функция ВывестиПолноеНаименованиеВалюты()
Если ПустоеЗначение(Валюта) = 1 Тогда
Возврат "Валюта не задана";
Иначе
Возврат Валюта.ПолнНаименование;
КонецЕсли;
КонецФункции
//*****************************************************************************
// ЗаголовокФормы()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Название операции
//
// Описание:
// Формирует название операции и заголовок формы диалога
//
Функция ЗаголовокФормы()
Перем Заголовок, Название;
Заголовок = глНазваниеДОкументаВЖурнале(Контекст);
Название = Заголовок+" №";
Если Выбран() = 1 Тогда
Если Проведен() = 1 Тогда
Заголовок = Заголовок + ". Проведен";
Иначе
Заголовок = Заголовок + ". Не проведен";
КонецЕсли;
Иначе
Заголовок = Заголовок + ". Новый";
КонецЕсли;
Форма.Заголовок(Заголовок);
Возврат Название;
КонецФункции // ЗаголовокФормы
//******************************************************************************
// ПоКнопкеПодбор()
//
// Параметры:
// нет.
// Возвращаемое значение:
// нет.
// Описание:
Процедура ПоКнопкеПодбор()
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(Фирма, "Фирма");
Параметры.ДобавитьЗначение(Склад, "Склад");
Параметры.ДобавитьЗначение(0, "ЕстьВидТМЦ");
Параметры.ДобавитьЗначение(Валюта, "Валюта");
Параметры.ДобавитьЗначение(Курс, "Курс");
Параметры.ДобавитьЗначение(Кратность, "Кратность");
Если Склад.РозничныйСклад = 0 Тогда
Параметры.ДобавитьЗначение("ИзСправочника", "ЦенаВподборе");
Параметры.ДобавитьЗначение(глЗначениеПоУмолчанию("ОсновнойТипЦенПродажи"), "ТипЦен");
Иначе
Параметры.ДобавитьЗначение("Розница", "ЦенаВподборе");
КонецЕсли;
Если Выбран() = 0 Тогда
Параметры.ДобавитьЗначение("Дата", "ТипГраницы");
Параметры.ДобавитьЗначение(ДатаДок, "ЗначениеГраницы");
Иначе
Параметры.ДобавитьЗначение("Позиция", "ТипГраницы");
Параметры.ДобавитьЗначение(ПолучитьПозицию(), "ЗначениеГраницы");
КонецЕсли;
Параметры.ДобавитьЗначение("Подбор номенклатуры в документ " + ПредставлениеВида() + " № " + НомерДок, "Заголовок");
глПодбор(Контекст, Параметры);
КонецПроцедуры // ПоКнопкеПодбор()
//******************************************************************************
// Печать(СразуНаПринтер, КолЭкз)
//
// Параметры:
// СразуНаПринтер - (1) если печать на принтер, (0) - с предварительным просмотром
// КолЭкз - количество экземпляров печати
//
// Возвращаемое значение:
// нет.
//
// Описание:
//
Процедура Печать(СразуНаПринтер = 0,КолЭкз = 1)
Перем ПечТаблица, ВысотаШапки;
ПечТаблица = СоздатьОбъект("Таблица");
// выводим шапку документа
ПечТаблица.ВывестиСекцию("Шапка");
// шапку повторяем на каждой странице
ВысотаШапки = ПечТаблица.ВысотаСекции("Шапка");
ПечТаблица.ПовторятьПриПечатиСтроки(1, ВысотаШапки);
// выводим товары
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ПечТаблица.ВывестиСекцию("Строка");
КонецЦикла;
// выводим подвал
ПечТаблица.ВывестиСекцию("Подвал");
Если СразуНаПринтер = 0 Тогда
// покажем результирующую таблицу
ПечТаблица.Опции(0, 0, ВысотаШапки, 0, "ПараметрыПечатиЧека", "ПараметрыПечатиЧека");
Если глПолучитьПолномочие("РазрешитьРедактированиеТаблиц") = 0 Тогда
ПечТаблица.Защита(1);
Иначе
ПечТаблица.Защита(0);
КонецЕсли;
ПечТаблица.ТолькоПросмотр(1);
ПечТаблица.Показать(глНазваниеДокументаВжурнале(Контекст),"""");
Иначе
ПечТаблица.ПараметрыСтраницы(,,,,,,,,,1,,);
ПечТаблица.КоличествоЭкземпляров(КолЭкз);
ПечТаблица.Напечатать(0);
КонецЕсли;
КонецПроцедуры // Печать()
//******************************************************************************
// ПоКнопкеПечать()
//
// Параметры:
// Нет
//
// Описание:
// Вызывается по кнопке "Печать"
//
Процедура ПоКнопкеПечать(СразуНаПринтер = 0,КолЭкз = 1)
// проверим полномочия печати непроведенных документов
Если (Проведен()=0)
Или ((Проведен()=1) И (Модифицированность()=1)) Тогда
Если глПолучитьПолномочие("РазрешитьПечатьНепроведенныхДокументов") = 0 Тогда
Предупреждение("Недостаточно полномочий для печати непроведенного документа!", 60);
Возврат;
КонецЕсли;
КонецЕсли;
Если ПустоеЗначение(НомерТекущейФормы) = 1 Тогда
НомерТекущейФормы = 1;
Форма.кнПечать.Заголовок(ТаблицаПечФорм.ПолучитьЗначение(НомерТекущейФормы, "Кнопка"));
КонецЕсли;
Если НомерТекущейФормы = 1 Тогда
Печать(СразуНаПринтер, КолЭкз);
Иначе
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(глВзятьКонтекст(Контекст), "Контекст");
Параметры.ДобавитьЗначение(СразуНаПринтер, "Устройство");
Параметры.ДобавитьЗначение(КолЭкз, "КоличествоКопий");
ОткрытьФорму("Отчет", Параметры, глКаталогПечФорм+ТаблицаПечФорм.ПолучитьЗначение(НомерТекущейФормы,"Файл"));
КонецЕсли;
КонецПроцедуры // ПоКнопкеПечать()
//******************************************************************************
// ПоКнопкеВыборПечатнойФормы()
//
// Параметры:
// нет.
//
// Возвращаемое значение:
// нет.
//
// Описание:
// - открывает список для выбора способа печати.
// - формирует таблицу по выбранному способу.
//
Процедура ПоКнопкеВыборПечатнойФормы()
ВыбНомер = глВыборПечатнойФормы("Документ." + Вид(), ТаблицаПечФорм);
Если ВыбНомер > 0 Тогда
НомерТекущейФормы = ВыбНомер;
Форма.кнПечать.Заголовок(ТаблицаПечФорм.ПолучитьЗначение(НомерТекущейФормы, "Кнопка"));
ПоКнопкеПечать();
КонецЕсли;
КонецПроцедуры // ПоКнопкеВыборПечатнойФормы()
//******************************************************************************
// ПриИзмененииСкидки()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
// Поле "Скидка".
//
// Описание:
// Если изменилась скидка - пересчитываем суммы.
//
Процедура ПриИзмененииСкидки()
Если СтараяСкидка<>Скидка Тогда
глПересчитатьСкидки(Контекст);
СтараяСкидка = Скидка;
КонецЕсли;
УправлениеВидимостью();
КонецПроцедуры // ПриИзмененииСкидки()
// *****************************************************************************
// ПолучитьТовар()
//
// Параметры:
// ШтрихКод - код/штрих-код искомого товара
// ВремТовар - возвращаемый товар
// ВремЕдиница - возвращаемая единица измерения
//
// Возвращаемое значение:
// 1 - товар найден, иначе 0
//
// Вызывается из:
// процедуры ПриИзмененииШтрихКода().
//
// Описание:
// Ищет товар по преданному штрих-коду/коду.
//
Функция ПолучитьТовар(ШтрихКод,ВремТовар,ВремЕдиница)
Рез = 0;
СпрЕдиницы = СоздатьОбъект("Справочник.Единицы");
СпрТовар = СоздатьОбъект("Справочник.Номенклатура");
Если СпрЕдиницы.НайтиПоРеквизиту("Штрихкод", ШтрихКод, 1) = 1 Тогда
ВремТовар = СпрЕдиницы.Владелец;
ВремЕдиница = СпрЕдиницы.ТекущийЭлемент();
Рез = 1;
ИначеЕсли СпрТовар.НайтиПоКоду(ШтрихКод,0) = 1 Тогда
ВремТовар = СпрТовар.ТекущийЭлемент();
ВремЕдиница = СпрТовар.БазоваяЕдиница;
Рез = 1;
Иначе
ВремКод = ШтрихКод;
Пока СтрДлина(ВремКод)<8 Цикл
ВремКод = глДополнитьСтрокуЛ(ВремКод, "0", СтрДлина(ВремКод)+1);
Если СпрТовар.НайтиПоКоду(ВремКод,0) = 1 Тогда
ВремТовар = СпрТовар.ТекущийЭлемент();
ВремЕдиница = СпрТовар.БазоваяЕдиница;
Рез = 1;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Рез;
КонецФункции // ПолучитьТовар()
//******************************************************************************
// ПриИзмененииШтрихКода()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
// Штрих - код.
//
// Описание:
// При изменении штрих - кода надо найти товар по введенному коду.
//
Процедура ПриИзмененииШтрихКода()
Перем ВремТовар,ВремЕдиница;
Если ПустоеЗначение(ШтрихКод)=0 Тогда
Если ПолучитьТовар(СокрЛП(ШтрихКод), ВремТовар, ВремЕдиница) = 1 Тогда
Номенклатура = ВремТовар;
Единица = ВремЕдиница;
Коэффициент = Единица.Коэффициент;
Если глПересчетРегистров(Контекст, СписокПараметров) = 0 Тогда
Возврат;
КонецЕсли;
ТовЦена = """";
Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа)
или (Склад.РозничныйСклад = 0) Тогда
Цена = глПолучитьЦену(Номенклатура, Константа.РозничныйТипЦен, ДатаДок, Единица, Валюта, Курс, Кратность);
Иначе // цена из остатков регистра
глПолучитьРозничныйОстатокЦену(Номенклатура, Единица, ОстаткиТМЦ, , ТовЦена);
СписокЦен = ЗначениеИзСтроки(ТовЦена);
Если СписокЦен.РазмерСписка() = 0 Тогда
Цена = 0;
Иначе
Цена = СписокЦен.ПолучитьЗначение(1);
КонецЕсли;
КонецЕсли;
глПересчетТаблЧасти(Контекст,"Единица"); // пересчитаем от выбранной единицы
Форма.Номенклатура.Доступность(1);
Форма.Количество.Доступность(1);
Иначе
Предупреждение("Товар со штрих-кодом "+СокрЛП(ШтрихКод)+" не найден!", 60);
Форма.Номенклатура.Доступность(0);
Форма.Количество.Доступность(0);
КонецЕсли;
Иначе
Форма.Номенклатура.Доступность(1);
Форма.Количество.Доступность(1);
КонецЕсли;
КонецПроцедуры // ПриИзмененииШтрихКода()
//******************************************************************************
// ПриИзмененииНоменклатуры()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога
// Колонка "Номенклатура" спецификации документа
//
// Описание:
// Производит необходимые действия при смене позиции номенклатуры в строке документа.
//
Процедура ПриИзмененииНоменклатуры()
Перем ВремКоэфф, ВремЦена, НоваяНоменклатура;
Перем ЦенаЦены, ЕдЦены, ВалютаЦены, ТипЦен;
Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа)
или (Склад.РозничныйСклад = 0) Тогда
// Процедуру "глПересчетТаблЧасти" не вызываем т.к. необходимо заполнить цену из справочника,
// а реквизита шапки "ТипЦен" в этом документе нет.
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Единица = 0;
Коэффициент = 0;
Цена = 0;
Количество = 0;
Сумма = 0;
Возврат;
КонецЕсли;
НоваяНоменклатура = 0;
Если ПустоеЗначение(Единица) = 1 Тогда
НоваяНоменклатура = 1;
ИначеЕсли Номенклатура <> Единица.Владелец Тогда
НоваяНоменклатура = 1;
КонецЕсли;
Если НоваяНоменклатура = 0 Тогда
Возврат;
КонецЕсли;
Если Номенклатура <> Номенклатура.ОсновнаяЕдиница.Владелец Тогда
Предупреждение("Для позиции номенклатуры """"" + СокрЛП(Номенклатура) +
""""" указана основная единица измерения, принадлежащая другому элементу справочника Номенклатура.", 60);
Возврат;
КонецЕсли;
Единица = Номенклатура.ОсновнаяЕдиница;
Коэффициент = Единица.Коэффициент;
ТипЦен = Константа.РозничныйТипЦен;
Если ПустоеЗначение(ТипЦен) = 1 Тогда
Возврат;
КонецЕсли;
Если глВернутьЦену(Номенклатура, ТипЦен, ДатаДок, ЦенаЦены, ЕдЦены, ВалютаЦены) <> 1 Тогда
Возврат; // для товара цены нет
КонецЕсли;
Единица = ЕдЦены;
Коэффициент = ЕдЦены.Коэффициент;
глПересчитатьЦенуВДокументе(Контекст, 0, 0, ЦенаЦены, ВалютаЦены,
ТипЦен.ЦенаВклНП, ТипЦен.ЦенаВклНДС);
Сумма = Цена * Количество * (1 - Скидка.Процент / 100);
Иначе
глПересчетТаблЧасти(Контекст, Форма.ТекущаяКолонка(), СписокПараметров);
КонецЕсли;
ШтрихКод = Единица.ШтрихКод;
// для услуг и работ цены можно редактировать, иначе нужно выбирать из остатков регистра
Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа)
или (Склад.РозничныйСклад = 0) Тогда
Форма.Цена.Редактирование(1);
Иначе
Форма.Цена.Редактирование(0);
КонецЕсли;
КонецПроцедуры // ПриИзмененииНоменклатуры()
//******************************************************************************
// РасчетСдачи()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Сумма сдачи
//
// Вызывается из формул элементов диалога:
// Надпись "Сдача".
//
// Описание:
// Вычисляет сумму сдачи.
//
Функция РасчетСдачи()
ВремСумма = Итог("Сумма");
ВремСдача = Макс(Получено - ВремСумма, 0);
Если (СтараяСумма <> ВремСумма) ИЛИ (СтараяПолучено <> Получено) Тогда
СтараяСумма = ВремСумма;
СтараяПолучено = Получено;
Попытка
глДПВывестиСтроки(глФРМ(ВремСумма,,""""), глФРМ(ВремСдача,,""""));
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Возврат (глФРМ(ВремСдача));
КонецФункции // РасчетСдачи()
//******************************************************************************
// ЗаполнениеПоДокументуОснованию()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
//
// Описание:
// Производит заполнение документа по документу - основанию.
//
Функция ЗаполнениеПоДокументуОснованию()
Если ДокОснование.Выбран()=0 Тогда
Возврат "Документ - основание не выбран!";
КонецЕсли;
ВидОсн = ДокОснование.Вид();
Если (ВидОсн <> "ЧекККМ") Тогда
Возврат "Неверный вид документа - основания!";
КонецЕсли; // вид ДокОснования
Если ДокОснование.ВидОперации = Перечисление.ВидыОперацийЧекККМ.ЧекНаВозврат Тогда
Возврат "На основании документа """"Чек на возврат"""" нельзя вводить документы !";
КонецЕсли;
ТаблицаДокумента = СоздатьОбъект("ТаблицаЗначений");
ДокОснование.ВыгрузитьТабличнуюЧасть(ТаблицаДокумента);
// очищаем наш документ
УдалитьСтроки();
ТаблицаДокумента.ВыбратьСтроки();
Пока ТаблицаДокумента.ПолучитьСтроку()=1 Цикл
ВремНоменклатура = ТаблицаДокумента.Номенклатура;
НоваяСтрока();
Штрихкод = ТаблицаДокумента.Штрихкод;
Номенклатура= ТаблицаДокумента.Номенклатура;
Количество = ТаблицаДокумента.Количество;
Единица = ТаблицаДокумента.Единица;
Коэффициент = ТаблицаДокумента.Коэффициент;
Цена = глПересчет(ТаблицаДокумента.Цена,
ДокОснование.Валюта,
ДокОснование.Курс,
Валюта,
Курс,
ДокОснование.Кратность,
Кратность);
ВремСумма = (Цена * Количество);
Сумма = ВремСумма - ВремСумма * Скидка.Процент / 100;
КонецЦикла; // по строкам основания
Если КоличествоСтрок() = 0 Тогда
Возврат "В документе основании не заполнена табличная часть";
КонецЕсли;
Возврат """";
КонецФункции // ЗаполнениеПоДокументуОснованию()
//*****************************************************************************
// ПоКнопкеОснование()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Описание:
// Вызывается по кнопке выбора документа основания
//
Процедура ПоКнопкеОснование()
Перем Основание;
// если документ основание уже есть, откроем его
Если ПустоеЗначение(ДокОснование) = 0 Тогда
ОткрытьФорму(ДокОснование);
Возврат;
КонецЕсли;
// если документа - основания нет, позволяем выбрать его
Основание = глВыбратьОснование(Контекст);
Если ПустоеЗначение(Основание) = 0 Тогда
// Выбрали основание
глЗаполнитьШапкуНаОсн(Контекст,Основание);
ТекстВопроса = "Заполнить по документу основанию?";
Если КоличествоСтрок() <> 0 Тогда
ТекстВопроса = ТекстВопроса + РазделительСтрок +" (перед заполнением табличная часть будет очищена)";
КонецЕсли;
Если Вопрос(ТекстВопроса, "Да+Нет", 60) <> "Да" Тогда
Возврат;
КонецЕсли;
УдалитьСтроки();
Результат = ЗаполнениеПоДокументуОснованию();
Если ПустоеЗначение(Результат) = 0 Тогда
Предупреждение(Результат, 60);
КонецЕсли;
КонецЕсли;
КонецПроцедуры //ПоКнопкеОснование()
//******************************************************************************
Функция ПробитьЧекНаККМ()
Перем НомерЧека;
СписокТоваров = СоздатьОбъект("ТаблицаЗначений");
СписокТоваров.НоваяКолонка("ТовНаим" , "Строка");
СписокТоваров.НоваяКолонка("Цена" , "Число");
СписокТоваров.НоваяКолонка("Количество", "Число");
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
СписокТоваров.НоваяСтрока();
СписокТоваров.ТовНаим = Номенклатура.Наименование;
СписокТоваров.Цена = Цена;
СписокТоваров.Количество = Количество;
КонецЦикла;
ПризнВозврата = ?(ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек, 0, 1);
ЧекПробитККМ = глФРПечататьЧек(СписокТоваров, Итог("Сумма"), ?(Получено=0,Итог("Сумма"),Получено), Скидка.Процент, ПризнВозврата, Склад.НомерСекции, НомерЧека);
Если ЧекПробитККМ = 1 Тогда
ПриЗаписиПерепроводить(0);
НомерЧекаККМ = НомерЧека;
Записать();
ПриЗаписиПерепроводить(1);
// Откроем денежный ящик, если он подключен
глДПОткрытьДенежныйЯщик();
КонецЕсли;
Возврат ЧекПробитККМ;
КонецФункции // ПробитьЧекНаККМ()
//******************************************************************************
//
//
Процедура ВыполнитьНажатиеНаКнопку(ИмяКнопки)
Если ИмяКнопки="Записать" Тогда
Записать();
ИначеЕсли ИмяКнопки="Провести" Тогда
БылПроведен=Проведен();
Если Записать()=1 Тогда
// если документ был проведен, то при записи он перепроведется
// и поэтому нет необходимости его снова проводить
Если БылПроведен=0 Тогда
Если ПравоДоступа("ПроведениеДокумента", "Документ.ЧекККМ") = 1 Тогда
Провести();
Иначе
Предупреждение("Недостаточно прав доступа!");
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли ИмяКнопки="ОК" Тогда
БылПроведен=Проведен();
Если Записать()=1 Тогда
// если документ был проведен, то при записи он перепроведется
// и поэтому нет необходимости его снова проводить
Если БылПроведен=0 Тогда
Если ПравоДоступа("ПроведениеДокумента", "Документ.ЧекККМ") = 1 Тогда
Если Провести()=0 Тогда
Возврат;
КонецЕсли;
Иначе
Предупреждение("Недостаточно прав доступа!");
КонецЕсли;
КонецЕсли;
Иначе
Возврат;
КонецЕсли;
КонецЕсли;
Если Проведен()=1 Тогда
// пробьем чек на ККМ
Если Касса.РежимККМ = Перечисление.РежимыККМ.ФР Тогда
Если глФРВкл = 1 Тогда
Если ЧекПробитККМ = 0 Тогда
Если ПробитьЧекНаККМ() = 0 Тогда
// по каким-то причинам Чек не пробит
Сообщить("Чек ККМ не пробит!");
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ИмяКнопки="ОК" Тогда
Форма.Закрыть(1);
КонецЕсли;
КонецПроцедуры
//////////////////////////////////
// ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ
//
//******************************************************************************
// предопределенная процедура
//
Процедура ВводНового(Скопирован)
АвтоВремяПослеТА();
глЗаполнитьШапку(Контекст, Скопирован);
Если Скопирован = 1 Тогда // если скопирован, то надо очистить реквизиты
ЧекПробитККМ = 0;
НомерЧекаККМ = 0;
Возврат;
КонецЕсли;
Если ПустоеЗначение(Касса) = 1 Тогда
Касса = глЗначениеПоУмолчанию("ОсновнаяКасса");
КонецЕсли;
Если ПустоеЗначение(Касса) = 1 Тогда
Предупреждение("Для текущего пользователя не настроена касса по умолчанию.
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
Если (Касса.РежимККМ = Перечисление.РежимыККМ.OffLine) ИЛИ (Касса.РежимККМ = Перечисление.РежимыККМ.OnLine) Тогда
// Для режимов OffLine и OnLine выписка чека не имеет смысла, т.к. чек
// пробивается в кассе
Предупреждение("Для ККМ с режимом работы OffLine или OnLine
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
Если ПустоеЗначение(Фирма) = 1 Тогда
Предупреждение("Для текущего пользователя не настроена фирма по умолчанию.
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
Если ПустоеЗначение(Склад) = 1 Тогда
Предупреждение("Для текущего пользователя не настроен склад по умолчанию.
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек;
КонецПроцедуры // ВводНового()
//******************************************************************************
// предопределенная процедура
//
Процедура ВводНаОсновании(ДокументОснование)
Касса = ДокументОснование.Касса;
Если (Касса.РежимККМ = Перечисление.РежимыККМ.OffLine) ИЛИ (Касса.РежимККМ = Перечисление.РежимыККМ.OnLine) Тогда
// Для режимов OffLine и OnLine выписка чека не имеет смысла, т.к. чек
// пробивается в кассе
Предупреждение("Для ККМ с режимом работы OffLine или OnLine
|Чек не может быть введен.",60);
СтатусВозврата(0); Возврат;
КонецЕсли;
СинонимДокумента = ПредставлениеВида();
СинонимОснования = ДокументОснование.ПредставлениеВида();
Список = глПолучитьСписокВводимыхНаОсновании(ДокументОснование);
Поз = Список.НайтиЗначение(Вид());
// выполним проверку, можно ли вводить документ на основании ДокументОснование
Если Поз = 0 Тогда
// ДокументОснование не найден в списке разрешенных
Предупреждение("Документ """"" + СинонимДокумента +
""""" нельзя вводить на основании """"" + СинонимОснования + """", 60);
СтатусВозврата(0);
Возврат;
КонецЕсли;
// чек вводится только на основании другого чека,
// поэтому он всегда является "чеком на возврат"
ВидОперации = Перечисление.ВидыОперацийЧекККМ.ЧекНаВозврат;
глЗаполнитьШапкуНаОсн(Контекст,ДокументОснование);
Результат = ЗаполнениеПоДокументуОснованию();
Если ПустоеЗначение(Результат) = 0 Тогда
Сообщить(Результат);
СтатусВозврата(0);
КонецЕсли;
КонецПроцедуры // ВводНаОсновании()
//******************************************************************************
// предопределенная процедура
//
Процедура ПриОткрытии()
// Заполним таблицу для выбора печатной формы
НомерТекущейФормы = глУстановкаКнопкиПечать(Контекст, "Документ." + Вид(),ТаблицаПечФорм);
Парам = Форма.Параметр;
Если ТипЗначенияСтр(Парам)="СписокЗначений" Тогда
Если ПустоеЗначение(Парам.Получить("Команда"))=1 Тогда
Сообщить("В форму документа "+Вид()+" передан неверный параметр!","I");
СтатусВозврата(0);Возврат;
КонецЕсли;
Если Парам.Получить("Команда") = "ПечатьНаПринтер" Тогда
КолЭкз = Макс(Число(Парам.Получить("КолЭкз")),1);
ПоКнопкеПечать(1,КолЭкз);
СтатусВозврата(0);Возврат;
ИначеЕсли Парам.Получить("Команда") = "ПечатьНаЭкран" Тогда
ПоКнопкеПечать(0);
СтатусВозврата(0);Возврат;
Иначе
Сообщить("В форму документа "+Вид()+" передана неверная команда "+Парам.Получить("Команда")+"!","I");
СтатусВозврата(0);Возврат;
КонецЕсли;
КонецЕсли;
// инициализация модульных переменных, контролирующих выполнение
// пересчетов и обновление надписей в форме
НачальнаяДатаДокумента = ДатаДок;
СтараяСкидка = Скидка;
Форма.ШтрихКод .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Номенклатура .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Единица .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Количество .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Цена .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Сумма .ВыполнятьФормулуТолькоПриИзменении(1);
глПроверкаРазрешенияРедактирования(Контекст);
Если Склад.РозничныйСклад = 1 Тогда
// на розн.складе всем разрашаем выбирать цену из списка
Форма.Цена.Доступность(1);
Форма.Цена.Редактирование(0);
КонецЕсли;
// если дата проведенного документа больше ТА, то открываем только на просмотр,
// так как его все равно не удастся сохранить после редактирования.
Если (Проведен() = 1) И (ДатаДок > ПолучитьДатуТА()) Тогда
Форма.ТолькоПросмотр(1);
КонецЕсли;
//Инициализирум список действий по кнопке "Действия"
СписокДействий = СоздатьОбъект("СписокЗначений");
СписокДействий.ДобавитьЗначение("Отчет о движениях документа");
СписокДействий.ДобавитьЗначение("Структура подчиненности");
// Если открыли только на просмотр, то надо кнопки сделать недоступными
Если Форма.ТолькоПросмотр()=1 Тогда
// СДЕЛАТЬ НЕДОСТУПНЫМИ КНОПКИ МОДИФИКАЦИИ ДОКУМЕНТА
Форма.кнОК.Доступность(0);
Форма.кнЗаписать.Доступность(0);
Форма.кнПровести.Доступность(0);
Форма.кнПодбор.Доступность(0);
КонецЕсли;
СписокДействий.ДобавитьЗначение("Ввести на основании");
СписокДействий.ДобавитьЗначение("Перейти в журнал");
// кнопка по умолчанию
Если (Форма.ТолькоПросмотр() = 1) ИЛИ ((ДатаДок < Макс(РабочаяДата(), ПолучитьДатуТА()) ) И (Выбран() = 1)) Тогда
Форма.КнопкаПоУмолчанию("кнЗакрыть");
Иначе
Форма.КнопкаПоУмолчанию("кнОК");
КонецЕсли;
ОбновитьНадписи();
УправлениеВидимостью();
глДПВключитьРежимВыводаСтрок();
//Если документ еще не проведен, тогда
//проведение делаем только в потоке
Если ( Проведен() = 0 ) Тогда
ПроводитьПослеТА(1,1);
КонецЕсли;
КонецПроцедуры // ПриОткрытии()
//******************************************************************************
// Предопределенная процедура
//
Процедура ПриНачалеРедактированияСтроки()
Форма.Номенклатура.Доступность(1);
Форма.Количество.Доступность(1);
// для услуг и работ цены можно редактировать, иначе нужно выбирать из остатков регистра
Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа)
или (Склад.РозничныйСклад = 0) Тогда
Форма.Цена.Редактирование(глПолучитьПолномочие("РазрешитьРедактированиеЦенВдокументах"));
Иначе
Форма.Цена.Редактирование(0);
КонецЕсли;
Если Форма.ТекущаяКолонка() = "Цена" Тогда
Если (Форма.ПолучитьАтрибут(Форма.ТекущаяКолонка()).Доступность() = 0)
И (глПолучитьПолномочие("РазрешитьРедактированиеЦенВдокументах") = 0)
И (ПустоеЗначение(Склад.РозничныйСклад) = 1)
Тогда
Предупреждение("Редактирование цен запрещено в соответствии
|с установленными полномочиями пользователя!", 60);
КонецЕсли;
ИначеЕсли (Форма.ТекущаяКолонка() = "Сумма" )
или (Форма.ТекущаяКолонка() = "СуммаНП" )
или (Форма.ТекущаяКолонка() = "СуммаНДС")
Тогда
Если (Форма.ПолучитьАтрибут(Форма.ТекущаяКолонка()).Доступность() = 0)
И (глПолучитьПолномочие("РазрешитьРедактированиеЦенВдокументах") = 0)
Тогда
Предупреждение("Редактирование цен запрещено в соответствии
|с установленными полномочиями пользователя!", 60);
КонецЕсли;
КонецЕсли;
КонецПроцедуры //ПриНачалеРедактированияСтроки()
//******************************************************************************
// Предопределенная процедура.
//
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
Если ИдентЭлемДиалога = "Цена" Тогда
Если (Склад.РозничныйСклад = 1)
и (Номенклатура.ВидНоменклатуры <> Перечисление.ВидыНоменклатуры.Услуга)
и (Номенклатура.ВидНоменклатуры <> Перечисление.ВидыНоменклатуры.Работа) Тогда
ФлагСтандОбр = 0;
// регистры рассчитываем, только если хочется редактировать цены вручную
Если глПересчетРегистров(Контекст, СписокПараметров) = 0 Тогда
Возврат;
КонецЕсли;
ТовЦена = """";
глПолучитьРозничныйОстатокЦену(Номенклатура, Единица, ОстаткиТМЦ, , ТовЦена);
СписокЦен = ЗначениеИзСтроки(ТовЦена);
СписокЦен.ВыбратьЗначение(Цена, , , 60,2);
глПересчетТаблЧасти(Контекст,"Цена");
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ПриНачалеВыбораЗначения()
//******************************************************************************
//Предопределенная процедура
//
Процедура ПриРедактированииНовойСтроки()
Форма.Номенклатура.Доступность(1);
Форма.Количество.Доступность(1);
КонецПроцедуры // ПриРедактированииНовойСтроки()
//******************************************************************************
//Предопределенная процедура
//
Процедура ПриЗаписи()
Если глМожноЗаписатьДокумент(Контекст)=0 Тогда
СтатусВозврата(0);
ИначеЕсли глКонтрольДатыДокумента(Контекст, НачальнаяДатаДокумента)=1 Тогда
СтатусВозврата(0);
КонецЕсли;
КонецПроцедуры // ПриЗаписи()
//******************************************************************************
//Предопределенная процедура
//
Процедура ПриЗакрытии()
глДПВключитьРежимВыводаБегСтроки();
КонецПроцедуры // ПриЗаписи()
//******************************************************************************
// Предопределенная процедура
//
Процедура ОбработкаПодбора(ВыбЗнач, КонтФормыПодбора)
// нет ставок налогов, есть скидка
глОбработкаПодбора(Контекст, ВыбЗнач, 0, 0, 1);
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ШтрихКод = Единица.ШтрихКод; // прописываем штрих - код
КонецЦикла;
КонецПроцедуры // ОбработкаПодбора()
//******************************************************************************
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
// Процедура разбирает штрих-код, считанный сканером
// и заполняет строки накладной
Перем Упаковка,ТекКоличество, Спецификация;
Перем ВремТовар, ВремЕдиница, ВремКоличество, ВремЦена;
Перем СтрокаВозврЦена;
Если Событие = "BarCodeValue" Тогда
Если Форма.ТолькоПросмотр() = 0 Тогда
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Если НомерСтроки > 0 Тогда
УдалитьСтроку();
КонецЕсли;
КонецЕсли;
Если глПолучитьТоварПоШтрихкоду(Данные, ВремТовар, ВремЕдиница, ВремКоличество) <> 0 Тогда
ТаблицаПодбора = СоздатьОбъект("ТаблицаЗначений");
ТаблицаПодбора.НоваяКолонка("Номенклатура");
ТаблицаПодбора.НоваяКолонка("Единица");
ТаблицаПодбора.НоваяКолонка("Количество", "Число");
ТаблицаПодбора.НоваяКолонка("Цена", "Число");
ТаблицаПодбора.НоваяСтрока();
ТаблицаПодбора.Номенклатура = ВремТовар;
ТаблицаПодбора.Единица = ВремЕдиница;
ТаблицаПодбора.Количество = ВремКоличество;
ПараметрыПодбора = СоздатьОбъект("СписокЗначений");
ПараметрыПодбора.ДобавитьЗначение(0, "ЕстьВидТМЦ");
Если (ВремТовар.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (ВремТовар.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа) Тогда
ТаблицаПодбора.Цена = глПолучитьЦену(ВремТовар, Константа.РозничныйТипЦен, ДатаДок, ВремЕдиница, Валюта, Курс, Кратность);
ПараметрыПодбора.ДобавитьЗначение("ИзСправочника" , "ЦенаВподборе");
ПараметрыПодбора.ДобавитьЗначение(Константа.РозничныйТипЦен, "ТипЦен");
ИначеЕсли Склад.РозничныйСклад = 0 Тогда
ТаблицаПодбора.Цена = глПолучитьЦену(ВремТовар, глЗначениеПоУмолчанию("ОсновнойТипЦенПродажи"), ДатаДок, ВремЕдиница, Валюта, Курс, Кратность);
ПараметрыПодбора.ДобавитьЗначение("ИзСправочника", "ЦенаВподборе");
ПараметрыПодбора.ДобавитьЗначение(глЗначениеПоУмолчанию("ОсновнойТипЦенПродажи"), "ТипЦен");
Иначе // цена из остатков регистра
ТовОстатки = СоздатьОбъект("Регистр.ОстаткиТМЦ");
ФирмаДляОстатковТМЦ = глФирмаДляОстатковТМЦ(Фирма);
ТовОстатки.УстановитьЗначениеФильтра("Фирма", ФирмаДляОстатковТМЦ, 2);
ТовОстатки.УстановитьЗначениеФильтра("Склад", Склад, 1);
глПолучитьРозничныйОстатокЦену(ВремТовар, ВремЕдиница, ТовОстатки, , СтрокаВозврЦена);
СписВозврЦен = ЗначениеИзстроки(СтрокаВозврЦена);
Если СписВозврЦен.РазмерСписка() = 1 Тогда
ТаблицаПодбора.Цена = глПересчет(СписВозврЦен.ПолучитьЗначение(1), глРубли, ДатаДок, Валюта, Курс,, Кратность);
ИначеЕсли СписВозврЦен.РазмерСписка() > 1 Тогда
Если СписВозврЦен.ВыбратьЗначение(ВремЦена,"Выберите цену для товара " + ВремТовар.Наименование, , 60) = 1 Тогда
ТаблицаПодбора.Цена = глПересчет(ВремЦена, глРубли, ДатаДок, Валюта, Курс,, Кратность);
Иначе
ТаблицаПодбора.Цена = 0;
КонецЕсли;
Иначе
ТаблицаПодбора.Цена = 0;
КонецЕсли;
ПараметрыПодбора.ДобавитьЗначение("Розница", "ЦенаВподборе");
КонецЕсли;
ПараметрыПодбора.ДобавитьЗначение(ТаблицаПодбора , "ТаблицаПодбора");
глОбработкаПодбора(Контекст, ПараметрыПодбора, 0, 0, 1);
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ШтрихКод = Единица.ШтрихКод; // прописываем штрих - код
КонецЦикла;
КонецЕсли;
КонецЕсли;
// Обработка закончена. Готовы к получению нового штрихкода.
глСканерПосылкаДанных(1);
Иначе
глОбработкаВнешнегоСобытия(Источник, Событие, Данные);
КонецЕсли;
КонецПроцедуры // ОбработкаВнешнегоСобытия()
////////////////////////////////////////////////////
// ТЕЛО МОДУЛЯ ФОРМЫ
//
НомерТекущейФормы = 0;
ТаблицаПечФорм = СоздатьОбъект("ТаблицаЗначений");
ТаблицаПечФорм.НоваяКолонка("Название","Строка",,,,30);
ТаблицаПечФорм.НоваяКолонка("Файл","Строка",,,"Файл",10);
ТаблицаПечФорм.НоваяКолонка("Кнопка","Строка",,,,10);
ТаблицаПечФорм.НоваяКолонка("ФайлОписания","Строка");
// добавим информацию о встроенной форме
ТаблицаПечФорм.НоваяСтрока();
ТаблицаПечФорм.Название = "Печатная форма товарного чека";
ТаблицаПечФорм.Кнопка = "Чек";
// Для выбора цен
ОбщРег = СоздатьОбъект("Регистры");
ОстаткиТМЦ = ОбщРег.ОстаткиТМЦ;
СписокПараметров = СоздатьОбъект("СписокЗначений");
СписокПараметров.Установить("ОбщРег" , ОбщРег);
СписокПараметров.Установить("ОстаткиТМЦ" , ОстаткиТМЦ);
СписокПараметров.Установить("ФильтрПоСкладу" , ПолучитьПустоеЗначение("Справочник.Склады"));
СписокПараметров.Установить("ФильтрПоФирме" , ПолучитьПустоеЗначение("Справочник.Фирмы"));
СписокПараметров.Установить("ПозицияРегистра" , 0);
СтараяСумма = -1; СтараяПолучено = -1;"
23.09.2009
18:19
#18
"Зачем весь модуль то было выкладывать? Вполне достаточно только текст процедуры "ОбработкаВнешнегоСобытия"...
Замените в этой процедуре строку:
"ТаблицаПодбора.Количество = ВремКоличество;"
на
"ТаблицаПодбора.Количество = ?(ВремКоличество=0, 1, ВремКоличество);""
Замените в этой процедуре строку:
"ТаблицаПодбора.Количество = ВремКоличество;"
на
"ТаблицаПодбора.Количество = ?(ВремКоличество=0, 1, ВремКоличество);""
Читают тему
(гостей: 1)