Изменение разрядности чисел в количестве ТМЦ
Здравствуйте, прошу знающим людям помочь. У меня установленна 1с 7,7 торговля и склад. Помогите настроить нужным образом разрядность чисел в количестве тмц в печатной форме "перемещение тмц". Фирма занимается продажей стройматериалов. В остатках тмц у нас есть и дробные и целые числа, так обои исчесляются в рулонах, кафель и ламинат в метрах квадратных, а плинтус в погонных метрах. Чтобы указать точное значение остатков ламината требуется пять знаков после запятой, плинтуса - один знак. Нужно избавиться от лишних нулей в печатной форме "перемещение тмц", то есть чтобы выводились и целые чилсла без нулей и полные дробные. Например: получить из 1,00000рул-1рул; 2,50000п.м-2,5п.м; и просто 0,26634 м.кв
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Чесно говоря, я в этом деле новичек. Вот модуль моей печатной формы:
//******************************************************************************
// Печать(Докум)
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Описание:
//
Процедура Печать(Докум, Устройство=0, КолвоКопий=1)
Перем НачПовт, КонПовт;
Если Докум.Проведен() = 0 Тогда
Предупреждение("Документ может быть распечатан только после проведения", 60);
Возврат;
КонецЕсли;
ИсхТабл = СоздатьОбъект("Таблица");
ЭтоПеремещениеВРозницу = ?(Докум.СкладПолучатель.РозничныйСклад = 1, 1, Докум.Склад.РозничныйСклад);
Если ЭтоПеремещениеВРозницу = 1 Тогда
ИсхТабл.ИсходнаяТаблица("ВРозницу");
КонецЕсли;
НачПовт = 0; КонПовт = 0;
// секция Заголовок
ИсхТабл.ВывестиСекцию("Заголовок");
НачПовт = НачПовт + ИсхТабл.ВысотаСекции("Заголовок");
// Секция Организация
Организация = СокрЛП(Докум.Фирма.ЮрЛицо.ПолнНаименование) + " " + глПредставлениеАдреса(Докум.Фирма.ЮрЛицо.ЮрАдрес);
ИсхТабл.ВывестиСекцию("Организация");
НачПовт = НачПовт + ИсхТабл.ВысотаСекции("Организация");
// Секция Шапка таблицы
ИсхТабл.ВывестиСекцию("ШапкаТаблицы");
КонПовт = НачПовт + ИсхТабл.ВысотаСекции("ШапкаТаблицы");
ИсхТабл.ПовторятьПриПечатиСтроки(НачПовт + 1, КонПовт);
Если ЭтоПеремещениеВРозницу = 0 Тогда
ТабДвиж = СоздатьОбъект("ТаблицаЗначений");
ТабДвиж.НоваяКолонка("Номенклатура");
ТабДвиж.НоваяКолонка("Количество");
ТабДвиж.НоваяКолонка("Сумма");
// сформируем таблицу с учетными цена из движений документа по регистру ПартииНаличие.
РегПартии = СоздатьОбъект("Регистр.ПартииНаличие");
РегПартии.ВыбратьДвиженияДокумента(Докум.ТекущийДокумент());
Пока РегПартии.ПолучитьДвижение() = 1 Цикл
Если РегПартии.Расход = 1 Тогда
ТабДвиж.НоваяСтрока();
ТабДвиж.Номенклатура = РегПартии.Номенклатура;
ТабДвиж.Количество = РегПартии.Количество;
ТабДвиж.Сумма = РегПартии.СуммаБезНДС;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// выводим строки документа
ВсегоСумма = 0;
НомСтроки = 0;
Докум.ВыбратьСтроки();
Пока Докум.ПолучитьСтроку() = 1 Цикл
Если ЭтоПеремещениеВРозницу = 0 Тогда
КолвоДок = Докум.Количество;
Поз = 0;
Пока (КолвоДок > 0) // есть что погашать
и (ТабДвиж.НайтиЗначение(Докум.Номенклатура, Поз, "Номенклатура") <> 0) // есть чем погашать
Цикл
КолвоРег = ТабДвиж.ПолучитьЗначение(Поз, "Количество");
СуммаРег = ТабДвиж.ПолучитьЗначение(Поз, "Сумма");
// преобразуем количество из регистра (в базовой единице)
// в единицу из строки документа
Если Докум.Коэффициент <> 0 Тогда
КолвоРег = КолвоРег / Докум.Коэффициент;
КонецЕсли;
КолвоПеч = Мин(КолвоДок, КолвоРег);
// пытаемся уменьшить потерю точности,
// поэтому сначала считаем сумму, а только потом цену
СуммаПеч = СуммаРег * КолвоПеч / КолвоРег;
ЦенаПеч = ?(КолвоПеч = 0, СуммаПеч, СуммаПеч / КолвоПеч);
ОстРег = КолвоРег - КолвоПеч;
Если ОстРег <= 0 Тогда
// количество из движений регистра полностью погасилось количеством из накладной
// удалим строку таблицы значений
ТабДвиж.УдалитьСтроку(Поз);
Иначе
// количество движений регистра оказалось больше, чем количество документа
ТабДвиж.УстановитьЗначение(Поз, "Количество", ОстРег * Докум.Коэффициент);
ТабДвиж.УстановитьЗначение(Поз, "Сумма" , СуммаРег - СуммаПеч);
КонецЕсли;
НомСтроки = НомСтроки + 1;
ИсхТабл.ВывестиСекцию("Строка");
// уменшаем непогашенное количество из строки документа
КолвоДок = КолвоДок - КолвоПеч;
// вычисляем итоги
ВсегоСумма = ВсегоСумма + СуммаПеч;
Поз = 0;
КонецЦикла;
Если КолвоДок > 0 Тогда
// по регистру прошло не все количество, которое было в докмуенте
КолвоПеч = КолвоДок;
СуммаПеч = 0;
ЦенаПеч = 0;
НомСтроки = НомСтроки + 1;
ИсхТабл.ВывестиСекцию("Строка");
КонецЕсли;
Иначе // ЭтоПеремещениеВРозницу = 1
НомСтроки = НомСтроки + 1;
ИсхТабл.ВывестиСекцию("Строка");
// Вычисляем итоги
ВсегоСумма = ВсегоСумма + Докум.Сумма;
КонецЕсли;
КонецЦикла;
ИсхТабл.ВывестиСекцию("Итого");
ИсхТабл.ВывестиСекцию("СуммаПрописью");
ИсхТабл.ВывестиСекцию("Подписи");
Если Устройство = 0 Тогда
ИсхТабл.Опции(0,0,0,0,"ОпцииПечатиПеремещениеТМЦ");
Если глПолучитьПолномочие("РазрешитьРедактированиеТаблиц") = 0 Тогда
ИсхТабл.ТолькоПросмотр(1);
Иначе
ИсхТабл.ТолькоПросмотр(0);
КонецЕсли;
ИсхТабл.Показать(глНазваниеДокументаВжурнале(Докум),"");
Иначе
ИсхТабл.ПараметрыСтраницы(,,,,,,,,,1,,);
ИсхТабл.КоличествоЭкземпляров(КолвоКопий);
ИсхТабл.Напечатать(0);
КонецЕсли;
КонецПроцедуры // Печать()
//******************************************************************************
// ПоКнопкеПечать()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Описание:
//
Процедура ПоКнопкеПечать()
Если Док.Выбран() = 0 Тогда
Предупреждение("Не выбран документ!", 60);
Возврат;
КонецЕсли;
Печать(Док);
КонецПроцедуры // ПоКнопкеПечать()
//******************************************************************************
// Предопределенная процедура
//
Процедура ПриОткрытии()
Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
Докум = Форма.Параметр.Получить("Контекст");
Устройство = Форма.Параметр.Получить("Устройство");
КолвоКопий = Форма.Параметр.Получить("КоличествоКопий");
Печать(Докум, Устройство, КолвоКопий);
Статусвозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры // ПриОткрытии()
//******************************************************************************
// Печать(Докум)
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Описание:
//
Процедура Печать(Докум, Устройство=0, КолвоКопий=1)
Перем НачПовт, КонПовт;
Если Докум.Проведен() = 0 Тогда
Предупреждение("Документ может быть распечатан только после проведения", 60);
Возврат;
КонецЕсли;
ИсхТабл = СоздатьОбъект("Таблица");
ЭтоПеремещениеВРозницу = ?(Докум.СкладПолучатель.РозничныйСклад = 1, 1, Докум.Склад.РозничныйСклад);
Если ЭтоПеремещениеВРозницу = 1 Тогда
ИсхТабл.ИсходнаяТаблица("ВРозницу");
КонецЕсли;
НачПовт = 0; КонПовт = 0;
// секция Заголовок
ИсхТабл.ВывестиСекцию("Заголовок");
НачПовт = НачПовт + ИсхТабл.ВысотаСекции("Заголовок");
// Секция Организация
Организация = СокрЛП(Докум.Фирма.ЮрЛицо.ПолнНаименование) + " " + глПредставлениеАдреса(Докум.Фирма.ЮрЛицо.ЮрАдрес);
ИсхТабл.ВывестиСекцию("Организация");
НачПовт = НачПовт + ИсхТабл.ВысотаСекции("Организация");
// Секция Шапка таблицы
ИсхТабл.ВывестиСекцию("ШапкаТаблицы");
КонПовт = НачПовт + ИсхТабл.ВысотаСекции("ШапкаТаблицы");
ИсхТабл.ПовторятьПриПечатиСтроки(НачПовт + 1, КонПовт);
Если ЭтоПеремещениеВРозницу = 0 Тогда
ТабДвиж = СоздатьОбъект("ТаблицаЗначений");
ТабДвиж.НоваяКолонка("Номенклатура");
ТабДвиж.НоваяКолонка("Количество");
ТабДвиж.НоваяКолонка("Сумма");
// сформируем таблицу с учетными цена из движений документа по регистру ПартииНаличие.
РегПартии = СоздатьОбъект("Регистр.ПартииНаличие");
РегПартии.ВыбратьДвиженияДокумента(Докум.ТекущийДокумент());
Пока РегПартии.ПолучитьДвижение() = 1 Цикл
Если РегПартии.Расход = 1 Тогда
ТабДвиж.НоваяСтрока();
ТабДвиж.Номенклатура = РегПартии.Номенклатура;
ТабДвиж.Количество = РегПартии.Количество;
ТабДвиж.Сумма = РегПартии.СуммаБезНДС;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// выводим строки документа
ВсегоСумма = 0;
НомСтроки = 0;
Докум.ВыбратьСтроки();
Пока Докум.ПолучитьСтроку() = 1 Цикл
Если ЭтоПеремещениеВРозницу = 0 Тогда
КолвоДок = Докум.Количество;
Поз = 0;
Пока (КолвоДок > 0) // есть что погашать
и (ТабДвиж.НайтиЗначение(Докум.Номенклатура, Поз, "Номенклатура") <> 0) // есть чем погашать
Цикл
КолвоРег = ТабДвиж.ПолучитьЗначение(Поз, "Количество");
СуммаРег = ТабДвиж.ПолучитьЗначение(Поз, "Сумма");
// преобразуем количество из регистра (в базовой единице)
// в единицу из строки документа
Если Докум.Коэффициент <> 0 Тогда
КолвоРег = КолвоРег / Докум.Коэффициент;
КонецЕсли;
КолвоПеч = Мин(КолвоДок, КолвоРег);
// пытаемся уменьшить потерю точности,
// поэтому сначала считаем сумму, а только потом цену
СуммаПеч = СуммаРег * КолвоПеч / КолвоРег;
ЦенаПеч = ?(КолвоПеч = 0, СуммаПеч, СуммаПеч / КолвоПеч);
ОстРег = КолвоРег - КолвоПеч;
Если ОстРег <= 0 Тогда
// количество из движений регистра полностью погасилось количеством из накладной
// удалим строку таблицы значений
ТабДвиж.УдалитьСтроку(Поз);
Иначе
// количество движений регистра оказалось больше, чем количество документа
ТабДвиж.УстановитьЗначение(Поз, "Количество", ОстРег * Докум.Коэффициент);
ТабДвиж.УстановитьЗначение(Поз, "Сумма" , СуммаРег - СуммаПеч);
КонецЕсли;
НомСтроки = НомСтроки + 1;
ИсхТабл.ВывестиСекцию("Строка");
// уменшаем непогашенное количество из строки документа
КолвоДок = КолвоДок - КолвоПеч;
// вычисляем итоги
ВсегоСумма = ВсегоСумма + СуммаПеч;
Поз = 0;
КонецЦикла;
Если КолвоДок > 0 Тогда
// по регистру прошло не все количество, которое было в докмуенте
КолвоПеч = КолвоДок;
СуммаПеч = 0;
ЦенаПеч = 0;
НомСтроки = НомСтроки + 1;
ИсхТабл.ВывестиСекцию("Строка");
КонецЕсли;
Иначе // ЭтоПеремещениеВРозницу = 1
НомСтроки = НомСтроки + 1;
ИсхТабл.ВывестиСекцию("Строка");
// Вычисляем итоги
ВсегоСумма = ВсегоСумма + Докум.Сумма;
КонецЕсли;
КонецЦикла;
ИсхТабл.ВывестиСекцию("Итого");
ИсхТабл.ВывестиСекцию("СуммаПрописью");
ИсхТабл.ВывестиСекцию("Подписи");
Если Устройство = 0 Тогда
ИсхТабл.Опции(0,0,0,0,"ОпцииПечатиПеремещениеТМЦ");
Если глПолучитьПолномочие("РазрешитьРедактированиеТаблиц") = 0 Тогда
ИсхТабл.ТолькоПросмотр(1);
Иначе
ИсхТабл.ТолькоПросмотр(0);
КонецЕсли;
ИсхТабл.Показать(глНазваниеДокументаВжурнале(Докум),"");
Иначе
ИсхТабл.ПараметрыСтраницы(,,,,,,,,,1,,);
ИсхТабл.КоличествоЭкземпляров(КолвоКопий);
ИсхТабл.Напечатать(0);
КонецЕсли;
КонецПроцедуры // Печать()
//******************************************************************************
// ПоКнопкеПечать()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Описание:
//
Процедура ПоКнопкеПечать()
Если Док.Выбран() = 0 Тогда
Предупреждение("Не выбран документ!", 60);
Возврат;
КонецЕсли;
Печать(Док);
КонецПроцедуры // ПоКнопкеПечать()
//******************************************************************************
// Предопределенная процедура
//
Процедура ПриОткрытии()
Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
Докум = Форма.Параметр.Получить("Контекст");
Устройство = Форма.Параметр.Получить("Устройство");
КолвоКопий = Форма.Параметр.Получить("КоличествоКопий");
Печать(Докум, Устройство, КолвоКопий);
Статусвозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры // ПриОткрытии()
(8) Не в модуле, а на самой печатной форме, там где проставляется это Ваше количество. Правда у Вас может быть несколько печатных форм. нужно опытным путем узнать какая из них используется. Напишите в "шапке" какой то текст и посмотрите какая из печатных форм отобразит текст (потом не забудьте вернуть все назад). И в найденной печатной форме сделайте так как я написал.
НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ СНАЧАЛА ВСЕ ЭТО ПРОДЕЛАТЬ НА КОПИИ БАЗЫ!!!!
НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ СНАЧАЛА ВСЕ ЭТО ПРОДЕЛАТЬ НА КОПИИ БАЗЫ!!!!
я так понял у Вас в документе установлено для количества 5 знаков дробной части. Если все настроено правильно и по регистрах проводится(перемещается) товар действительно с пятью знаками после запятой, тогда мой первый вопрос снимается (который я хотел задать)- правильно ли все проводится/перемещается (в количественном измерении).
Теперь насчет отбрасывания нулей справа на печатной форме. У вас в Печатной форме наверное явно указано сколько печатать чисел после запятой. Может что-то такое:
Напишите проще:
Тогда у числа автоматически уберутся лишние нули справа до первого ненулевого значения.
Теперь насчет отбрасывания нулей справа на печатной форме. У вас в Печатной форме наверное явно указано сколько печатать чисел после запятой. Может что-то такое:
Формат(Количество,"Ч14.5")
Напишите проще:
Число(Количество)
Тогда у числа автоматически уберутся лишние нули справа до первого ненулевого значения.
В глобальном модуле есть функция
Функция глФРМКоличество(Знач ЧислЗнач,Единица="", РаздТриад=" ") Экспорт
Она отвечает за вывод количества в печатных формах.
Формируемая строка печати
Стр=СокрЛ(Формат(ЧислЗнач,"Ч015.3." + РаздТриад));
Вот с ней и надо экспериментировать.
Функция глФРМКоличество(Знач ЧислЗнач,Единица="", РаздТриад=" ") Экспорт
Она отвечает за вывод количества в печатных формах.
Формируемая строка печати
Стр=СокрЛ(Формат(ЧислЗнач,"Ч015.3." + РаздТриад));
Вот с ней и надо экспериментировать.
В таблицах с макетами "Таблица" и "ВРозницу" в свойствах ячейки с количеством на закладке "Текст" уберите вызов глФРМКоличество, т.е. вместо глФРМКоличество(Докум.Количество) оставьте Докум.Количество (табл. ВРозницу) и вместо глФРМКоличество(КолвоПеч) оставьте КолвоПеч (табл. Таблица).
Вот смотрите, файл PEREMES.EFD в папке PRNFORMS, подчинен докемунту "перемещение ТМЦ" его я чуть чуть отредактировал - убрал ненужные столбцы и строки, ее функции я не повредил. Все работает хорошо. Щас только нули лишние выдает. Вообщем я попробывал: конфигуратор - открыть PEREMES.EFD, вкладка таблица. В ячейке количества прописано "глФРМКоличество(КолвоПеч)". То, что Вы имеете в виду я уже читал на этом или другом форуме в похожей теме, только по разрядам в цене. Так и не нашел эти строки.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот