В типовую БП2.0 добавлена ТТН 1-Т. Необходимо переписать под БП3.0.
Отменено
65 |
0
19 мая 2023 в 20:11:54
(1 год 26 недель 6 дней 7 часов назад)
66900
03.05.2017 18:41:16
Текст задания
Есть типовая БП2.0. В ней самописный документ ТТН 1-Т (модули приведены ниже). Надо переписать его для работы с БП3.0.49. Желательно, максимально использовать новые механизмы (печать, проверка договора и пр.).
///==============================================================================
// Функция осуществляет печать формы "1-Т"
// на основании документа "РеализацияТоваровУслуг".
function ПечатьТТН()
Перем ПодразделениеОтветственныхЛиц;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Документ", ref);
Запрос.УстановитьПараметр("ПустойКонтрагент", Справочники.Контрагенты.ПустаяСсылка());
Запрос.Текст =
"ВЫБРАТЬ
| ТТН_1Т.Номер,
| ТТН_1Т.Дата КАК ДатаДокумента,
| ТТН_1Т.Организация,
| ТТН_1Т.Организация КАК ЮрФизЛицо,
| ТТН_1Т.Организация КАК Поставщик,
| ТТН_1Т.Организация КАК Контрагент,
| ТТН_1Т.Организация КАК Руководители,
| ВЫБОР КОГДА ТТН_1Т.Грузоотправитель = &ПустойКонтрагент
| ТОГДА ТТН_1Т.Организация
| ИНАЧЕ ТТН_1Т.Грузоотправитель КОНЕЦ КАК Грузоотправитель,
| ВЫБОР КОГДА ТТН_1Т.Грузополучатель = &ПустойКонтрагент
| ТОГДА ТТН_1Т.Заказчик
| ИНАЧЕ ТТН_1Т.Грузополучатель КОНЕЦ КАК Грузополучатель,
| ТТН_1Т.Организация.ОсновнойБанковскийСчет КАК БанковскийСчет,
| ТТН_1Т.Заказчик КАК Покупатель,
| ТТН_1Т.Заказчик КАК Плательщик,
| ТТН_1Т.Товары.(
| НомерСтроки КАК Номер,
| Номенклатура,
| ХарактеристикаНоменклатуры,
| Номенклатура.НаименованиеПолное КАК ТоварНаименование,
| Номенклатура.Код КАК ТоварКод,
| Количество,
| Склад,
| КоличествоМест,
| Номенклатура.БазоваяЕдиницаИзмерения КАК БазоваяЕдиницаНаименование,
| ЕдиницаИзмерения КАК ВидУпаковки,
| ЕдиницаИзмерения.Код КАК БазоваяЕдиницаКодПоОКЕИ,
| 0 КАК Цена,
| 0 КАК Сумма
| )
|ИЗ
| Документ.PD_ТТН_1Т КАК ТТН_1Т
|ГДЕ
| ТТН_1Т.Ссылка = &Документ";
ОбластьМакета = Макет.ПолучитьОбласть("СведенияОГрузеШапка");
ТабДокумент.Вывести(ОбластьМакета);
for each ВыборкаСтрокТовары in ВыборкаСтрок do
ОбластьМакета = Макет.ПолучитьОбласть("СведенияОГрузеСтрока");
ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
if ValueIsFilled(ВыборкаСтрокТовары.ХарактеристикаНоменклатуры) then
ОбластьМакета.Параметры.ТоварНаименование = ВыборкаСтрокТовары.ТоварНаименование + " " + ВыборкаСтрокТовары.ХарактеристикаНоменклатуры;
endIf;
///==============================================================================
// Процедура осуществляет печать документа. Можно направить печать на
// экран или принтер, а также распечатать необходимое количество копий.
//
// Название макета печати передается в качестве параметра,
// по переданному названию находим имя макета в соответствии.
//
// Параметры:
// НазваниеМакета - строка, название макета.
Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, НепосредственнаяПечать = Ложь) Экспорт
if ИмяМакета = "ТТН" then
ТабДокумент = ПечатьТТН();
elsIf ИмяМакета = "ТехПаспорт" then
ТабДокумент = ПечатьТехПаспортов();
endIf;
// Возвращает доступные варианты печати документа
//
// Возвращаемое значение:
// Структура, каждая строка которой соответствует одному из вариантов печати
//
Функция ПолучитьСтруктуруПечатныхФорм() Экспорт
return new Структура("ТТН,ТТН_до20140925,ТехПаспорт", "ТТН 1Т", "ТТН 1Т (до 25 09 2014)", "Паспорт качества бетонной смеси (Технический паспорт)");
КонецФункции // ПолучитьСтруктуруПечатныхФорм()
bCanChooseSale = IsInRole("Бухгалтер") or IsInRole("ПолныеПрава");
if not bCanChooseSale and ref.утвержен then
Отказ = true;
Message("Вам нельзя изменять утвержденную ТТН.");
endIf;
totalCount = Товары.Итог("Количество");
goods = "";
separator = "";
for each vLine in Товары do
goods = goods + separator + vLine.Номенклатура.Наименование;
separator = ", ";
endDo;
vt = Товары.Выгрузить(, "Склад");
vt.GroupBy("Склад");
склады = "";
separator = "";
for each vLine in Товары do
склады = склады + separator + vLine.Склад.Наименование;
separator = ", ";
endDo;
КонецПроцедуры // ПередЗаписью
Модуль формы:
// Хранит текущую дату документа - для проверки перехода документа в другой период установки номера
Перем мТекущаяДатаДокумента;
// Хранит список видов договоров, доступных для данного документа
Перем мСписокВидовДоговоров;
// Хранит текущий договор контрагента
// используется для восстановления старого договора в случае некорректного выбора нового
Перем мТекущийДоговорКонтрагента;
Перем мПодменюПечати; // Хранит элемент управления подменю печати
Перем мПечатьПоУмолчанию; // Хранит элемент управления кнопку печать по умолчанию
Перем мДеревоМакетов; // Хранит дерево макетов печатных форм
Перем мКнопкиЗаполненияТЧ; // Хранит соответствие
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ
// Процедура устанавливает подменю "Заполнить" в командных панелях ТЧ документа при необходимости
//
Процедура УстановитьКнопкиПодменюЗаполненияТЧ();
СоответствиеТЧ = Новый Соответствие;
СоответствиеТЧ.Вставить(ЭлементыФормы.Товары, ЭлементыФормы.КоманднаяПанельТовары);
мКнопкиЗаполненияТЧ = УниверсальныеМеханизмы.СформироватьПодменюЗаполненияТЧ(Ссылка, СоответствиеТЧ, Новый Действие("НажатиеНаДополнительнуюКнопкуЗаполненияТЧ"));
КонецПроцедуры
//Процедура устанавливает подменю "Печать" и кнопку "Печать по умолчанию" при необходимости
//
Процедура УстановитьКнопкиПечати()
мДеревоМакетов = УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати(Ссылка, ПолучитьСтруктуруПечатныхФорм(), Новый Действие("ОсновныеДействияФормыПечать"), Новый Действие("ОсновныеДействияФормыУстановитьПечатьПоУмолчанию"));
Если Не мПодменюПечати = Неопределено Тогда
УниверсальныеМеханизмы.СформироватьПодменю(мДеревоМакетов, мПодменюПечати,Истина,Истина);
КонецЕсли;
КонецПроцедуры
// Процедура - обработчик нажатия на любую из дополнительных кнопок по заполнению ТЧ
//
Процедура НажатиеНаДополнительнуюКнопкуЗаполненияТЧ(Кнопка)
УниверсальныеМеханизмы.ОбработатьНажатиеНаДополнительнуюКнопкуЗаполненияТЧ(мКнопкиЗаполненияТЧ.Строки.Найти(Кнопка.Имя,"Имя",Истина),ЭтотОбъект);
КонецПроцедуры
// Процедура - обработчик нажатия на кнопку "Печать по умолчанию"
//
Процедура ОсновныеДействияФормыПечатьПоУмолчанию(Кнопка)
УниверсальныеМеханизмы.ПечатьПоДополнительнойКнопке(мДеревоМакетов, ЭтотОбъект, ЭтаФорма, Кнопка.Текст);
КонецПроцедуры
// Процедура - обработчик нажатия на кнопку "Установить печать по умолчанию"
//
Процедура ОсновныеДействияФормыУстановитьПечатьПоУмолчанию(Кнопка)
Если УниверсальныеМеханизмы.НазначитьКнопкуПечатиПоУмолчанию(мДеревоМакетов, Метаданные().Имя) Тогда
УстановитьКнопкиПечати();
КонецЕсли;
КонецПроцедуры
// Процедура разрешения/запрещения редактирования номера документа
Процедура ДействияФормыРедактироватьНомер(Кнопка)
// Установка кнопок печати
УстановитьКнопкиПечати();
// Установка кнопок заполнение ТЧ
УстановитьКнопкиПодменюЗаполненияТЧ();
КонецПроцедуры // ПередОткрытием
///==============================================================================
// Процедура - обработчик события "ПриОткрытии" формы
Процедура ПриОткрытии()
Если ЭтоНовый() Тогда // проверить объект на то, что он еще не внесен в ИБ
// Заполнить реквизиты значениями по умолчанию.
ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(ЭтотОбъект, глЗначениеПеременной("глТекущийПользователь"), мВалютаРегламентированногоУчета, "Покупка",ПараметрОбъектКопирования);
СрокДоставки = ТекущаяДата();
Документ = "";
if ValueIsFilled(видЖурнала) = false then
видЖурнала = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "mainTTNJournalKind");
endIf;
if ValueIsFilled(грузоотправитель) = false then
грузоотправитель = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "основнойГрузоотправитель");
endIf;
СтруктураКолонок = Новый Структура();
// Установить колонки, видимостью которых пользователь управлять не может.
СтруктураКолонок.Вставить("Номенклатура");
СтруктураКолонок.Вставить("Количество");
// Установить ограничение - изменять видимость колонок для табличной части
ОбработкаТабличныхЧастей.УстановитьИзменятьВидимостьКолонокТабЧасти(ЭлементыФормы.Товары.Колонки, СтруктураКолонок);
// Установить доступность формы с учетом даты запрета редактирования
РаботаСДиалогами.УстановитьДоступностьФормыДляРедактирования(ЭтотОбъект, ЭтаФорма);
bCanChooseSale = IsInRole("Бухгалтер") or IsInRole("ПолныеПрава");
ЭлементыФормы.реализация.Доступность = bCanChooseSale;
if not bCanChooseSale and утвержен then
ТолькоПросмотр = true;
endIf;
КонецПроцедуры // ПриОткрытии()
////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМ СВЯЗАННЫХ С КОНТАКТНОЙ ИНФОРМАЦИЕЙ
РаботаСДиалогами.УстановитьЗаголовокФормыДокумента("", ЭтотОбъект, ЭтаФорма);
МеханизмНумерацииОбъектов.ОбновитьПодсказкуКодНомерОбъекта(ЭтотОбъект.Метаданные(), ЭлементыФормы.ДействияФормы.Кнопки.Подменю, ЭлементыФормы.Номер);
УстановитьКнопкиПечати();
if not MakeSale() then
утвержен = false;
ПодключитьОбработчикОжидания("ЗаписатьСнятиеУтверждение", 0.1, true);
endIf;
КонецПроцедуры // ПослеЗаписи
///==============================================================================
function MakeSale()
if not утвержен then
return true;
endIf;
if not ValueIsFilled(ДоговорКонтрагента) then
Message("У заказчика не указан основной договор.");
return false;
endIf;
priceType = ДоговорКонтрагента.ТипЦен;
if not ValueIsFilled(priceType) then
Message("В основном договоре не указан тип цен.");
return false;
endIf;
if ValueIsFilled(реализация) then
sale = реализация;
else
sale = PD_CommonUnit.ПолучитьРеализациюПо1Т(ref);
endIf;
SetPrivilegedMode(true);
BeginTransaction();
try
if ValueIsFilled(sale) then
saleObj = sale.GetObject();
else
saleObj = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
endIf;
saleObj.Дата = CurrentDate();
saleObj.Заполнить(ref);
saleObj.Комментарий = "Создан / обновлен на основании ТТН № " + Номер + " (" + CurrentDate() + "); " + saleObj.Комментарий;
saleObj.Write(РежимЗаписиДокумента.Проведение);
sale = saleObj.ref;
if sale.УчитыватьНДС then
invoice = УчетНДС.НайтиПодчиненныйСчетФактуру(sale, "СчетФактураВыданный");
if not ЗначениеЗаполнено(invoice) then
invObj = Документы.СчетФактураВыданный.СоздатьДокумент();
invObj.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаРеализацию;
invObj.Ответственный = ПараметрыСеанса.ТекущийПользователь;
invObj.Заполнить(sale);
invObj.Write(РежимЗаписиДокумента.Проведение);
endIf;
endIf;
except
RollbackTransaction();
DoMessageBox("Не возможно создать / обновить реализацию.");
return false;
endTry;
// Процедура - обработчик события "ПриИзменении" поля ввода организации.
//
Процедура ОрганизацияПриИзменении(Элемент)
Если Не ПустаяСтрока(Номер) Тогда
МеханизмНумерацииОбъектов.СброситьУстановленныйКодНомерОбъекта(ЭтотОбъект, "Номер", ЭлементыФормы.ДействияФормы.Кнопки.Подменю, ЭлементыФормы.Номер);
КонецЕсли;
// Выполняем общие действия для всех документов при изменении Организация.
ЗаполнениеДокументов.ПриИзмененииЗначенияОрганизации(ЭтотОбъект, глЗначениеПеременной("глТекущийПользователь"));
ЗаполнитьСписокВидовДоговоров();
КонтрагентПриИзменении(Элемент);
КонецПроцедуры // ОрганизацияПриИзменении
// Процедура - обработчик события "ПриИзменении" поля ввода контрагента.
//
Процедура КонтрагентПриИзменении(Элемент)
// Выполняем общие действия для всех документов при изменении Контрагент.
ЗаполнениеДокументов.ПриИзмененииЗначенияКонтрагента(ЭтотОбъект, мСписокВидовДоговоров, , , "Заказчик");
// Могли поменять договор.
ПриИзмененииДоговора();
КонецПроцедуры // КонтрагентПриИзменении()
// Процедура - обработчик события "НачалоВыбора" поля ввода ДоговорКонтрагента
//
Процедура ДоговорКонтрагентаНачалоВыбора(Элемент, СтандартнаяОбработка)
// сохраним договор контрагента, возможно понадобится к нему вернуться
мТекущийДоговорКонтрагента = ДоговорКонтрагента;
РаботаСДиалогами.НачалоВыбораЗначенияДоговораКонтрагента(ЭтотОбъект, ЭтаФорма, Элемент, Заказчик, ДоговорКонтрагента, мСписокВидовДоговоров, СтандартнаяОбработка);
КонецПроцедуры // ДоговорКонтрагентаНачалоВыбора
///==============================================================================
// Процедура - обработчик события "ПриИзменении" поля ввода
// "ДоговорКонтрагента". Процедура выполняет действия при изменении договора
// взаиморасчетов с контрагентом.
Процедура ДоговорКонтрагентаПриИзменении(Элемент)
мСписокВидовДоговоров = Новый СписокЗначений;
мСписокВидовДоговоров.Добавить(Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
КонецПроцедуры // ЗаполнитьСписокВидовДоговоров
// Процедура выполняет необходимые действия при изменении договора взаиморасчетов
// с контрагентом.
//
Процедура ПриИзмененииДоговора()
Если НЕ ЗначениеЗаполнено(ДоговорКонтрагента) Тогда
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Заказчик) Тогда
Заказчик = ДоговорКонтрагента.Владелец;
ИначеЕсли ЗначениеЗаполнено(ДоговорКонтрагента) И Заказчик <> ДоговорКонтрагента.Владелец Тогда //Владелец нового договора должен совпадать с контрагентом документа.
Предупреждение("Выбранный договор принадлежит другому контрагенту.
|Будет восстановлен старый договор.");
ДоговорКонтрагента = мТекущийДоговорКонтрагента;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Организация) Тогда
Организация = ДоговорКонтрагента.Организация;
КонецЕсли;
Если мТекущийДоговорКонтрагента = Неопределено Тогда
мТекущийДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
Конецесли;
КонецПроцедуры // ПриИзмененииДоговора
Добрый день, готов взяться за данную работу. Прошу уточнить формат удаленного подключения (рдп, тимвьювер..) и наличие тестовых баз. Можем на первом этапе просто перенести документ (около трех часов). Далее по необходимости печать документа перенести в модуль менеджера и включить в подсистему печати из БСП. Возможно стоит заменить текст модулей на кирилицу.
Я так понимаю этот документ создавался из-за того, что данные для печати ТТН не сохранялись.
В БП 3.0 для печати ТТН периодически добавляют новые "плюшки". Если вы вдруг на это не обращали внимание, то рекомендую ознакомиться с разделом в документе реализации "Доставка" (ссылка внизу формы документа).
Исходя из того, что известно и вышеизложенного, вижу два варианта решения:
1. Перенести все, как было у вас в 2.0
Документ и РегистрСведений для связки ТТН с Реализацией. Возможно нужно будет ещё что-то добавить, в текстовом
варианте не очень читабельно и писал явно не "чистый" программист 1с. Желательно все смотреть в конфигурации,
т.к. есть ссылки на ,как минимум, один общий модуль.
2. Вместо документа добавить внешние печатные формы (4 шт.).
С количеством печатных форм нужно определяться, т.к. возможно не всеми пользуетесь и для ТТН Т-1 подойдет
стандартная печать.
С моей точки зрения, более приемлемый вариант №2, но возможно в силу каких-то нюансов окажется более предпочтительным вариантом №1
В любом случае для более точной оценки задания необходимо видеть конфигурацию вживую.