Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Разделить строку на несколько полей печатной формы

Разделить строку на несколько полей печатной формы
Я
   Mahazbek
 
22.03.19 - 09:24
Здравствуйте! Я совсем новичок и это мое первое сообщение на форуме (свист, аплодисменты). Рад присоединиться к команде и всех приветствую!
Недавно из сисадмина я перешел в начинающего программиста 1С, так уж пришлось по работе. С темой 1С был знаком мало, вот разбираюсь потихоньку. Есть задача - написать печатную форму, в которую берутся данные из документа ПоступлениеТоваровУслуг.

В форме есть поля с параметрами, которые заполняются данными, полученными в результате запроса:

Макет.Параметры.Номер = ВыборкаДетальныеЗаписи.Номер;
Макет.Параметры.Дата = Формат(ВыборкаДетальныеЗаписи.Дата, "ДФ=dd.MM.yyyy");
Макет.Параметры.Контрагент = ВыборкаДетальныеЗаписи.Контрагент;
Макет.Параметры.Комментарий = ВыборкаДетальныеЗаписи.Комментарий; <-- Вот это проблема

В поля подставляются значения, тут все ок. Однако есть поле "Комментарий", строка с текстом. Текст выглядит примерно так:

Текст Такой# Текст Другой# Текст Третий

В одной строке текст разделен решеткой для того, чтобы выводить эти данные в три поля печатной формы, в каждом поле разный текст, пример:

Макет печатной формы

Поле 1 - Текст Такой
Поле 2 - Текст Другой
Поле 3 - Текст Третий

Все из одной строки. Прошу помочь, если кому не сложно, подсказать каким путем это делается, так как еще не знаю даже какие инструменты есть в платформе. Заранее благодарю всех!
 
 
   Web00001
 
1 - 22.03.19 - 09:32
Хорошо бы указать конфигурацию которую вы используете
в типовых конфигурациях обычно есть такая функция: СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок
Она вернет массив из трех элементов
В итоге это будет выглядет так:
Массив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаКомментарий, "#");

Макет.Параметры.Поле1 = Массив[0];
Макет.Параметры.Поле2 = Массив[1];
Макет.Параметры.Поле3 = Массив[2];
   ДенисЧ
 
2 - 22.03.19 - 09:32
СтрРазделить() например
   Web00001
 
3 - 22.03.19 - 09:34
(0)Про работу с макетами я писал вот здесь http://wiki-1c.ru/doku.php/1c:общие:табличный_документ
   Mahazbek
 
4 - 22.03.19 - 09:35
Спасибо за оперативность! 1С:Предприятие 8.3 (8.3.13.1644) УСХП 1.3
   Web00001
 
5 - 22.03.19 - 09:44
>>УСХП 1.3
Тогда глобальный поиск РазложитьСтрокуВМассивПодстрок я не знаю где она лежит в УСХП

>>Рад присоединиться к команде и всех приветствую! 
Примите мои искренние соболезнования
   Mahazbek
 
6 - 22.03.19 - 11:03
Не осилил пока массивы )

Зато нашлось другое решение:

Комментарий = ВыборкаДетальныеЗаписи.Комментарий;
        
        Инд1 = Найти(Комментарий, "#"); 

        Строка1 = СокрЛП(Лев(Комментарий, Инд1 - 1));
        ОстСтроки = СокрЛП(Сред(Комментарий, Инд1 + 1)); 
        Инд2 = Найти(ОстСтроки, "#"); 

        Строка2 = СокрЛП(Лев(ОстСтроки, Инд2 - 1)); 
        Строка3 = СокрЛП(Сред(ОстСтроки, Инд2 + 1)); 
        
        Макет.Параметры.Комментарий1 = Строка1;
        Макет.Параметры.Комментарий2 = Строка2;
        Макет.Параметры.Комментарий3 = Строка3;
   1С Ассенизатор ПРОФ
 
7 - 22.03.19 - 11:36
(6) Ответили же выше.
"в типовых конфигурациях обычно есть такая функция: СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок"

Поищите глобальным поиском по "РазложитьСтрокуВМассивПодстрок". Не нужно велосипед изобретать.
   Mahazbek
 
8 - 22.03.19 - 16:35
(7) Я это сделал, начался длительный поиск, в результате - тысяча строк, содержащими "РазложитьСтрокуВМассивПодстрок". Просто не понял, что с этим делать.
   Garykom
 
9 - 22.03.19 - 16:44
(6) Зачем так долго через операции с подстроками?

Когда можно проще через СтрРазделить() на новых платформах без режима совместимости или СтрЗаменить() и СтрПолучитьСтроку() на старых платформах 1С.
   FIXXXL
 
10 - 22.03.19 - 16:46
(8) скопировать полный вызов и заменить параметр функции на свой
 
 Рекламное место пустует
   ptiz
 
11 - 22.03.19 - 16:52
(8) В (1) уже дан почти готовый код, не надо никаких глобальных поисков.
   Mahazbek
 
12 - 26.03.19 - 14:44
Спасибо вам, разобрался с массивом из решения (1) Web00001. Через СокрЛП работает коряво, а с массивом все гладко )). Сейчас разбираюсь, почему макет открывается если использовать обработку через Файл - открыть обработку, затем выбрать документ и не открывается, если привязать ее к документу. Ошибка "Недостаточно фактических параметров".
   Mahazbek
 
13 - 26.03.19 - 14:47
Может стоит выложить код, когда все будет работать? Вдруг у кого такая же задача и он тоже новичок? ) Ему поможет
   Mahazbek
 
14 - 26.03.19 - 15:54
Собственно, вот код:

Функция Печать(Ссылка) Экспорт
    
    ИмяМакета = "Макет";
        
    ТабДокумент = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет(ИмяМакета);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ПоступлениеТоваровУслуг.Ссылка,
        |    ПоступлениеТоваровУслуг.Номер,
        |    ПоступлениеТоваровУслуг.Дата,
        |    ПоступлениеТоваровУслуг.Контрагент,
        |    ПоступлениеТоваровУслуг.Комментарий,
        |    ПоступлениеТоваровУслуг.Товары.(
        |        Количество
        |    )
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
        |ГДЕ
        |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);  
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Макет.Параметры.Номер = ВыборкаДетальныеЗаписи.Номер;
        Макет.Параметры.Дата = Формат(ВыборкаДетальныеЗаписи.Дата, "ДФ=dd.MM.yyyy");
        Макет.Параметры.Контрагент = ВыборкаДетальныеЗаписи.Контрагент;
        
        СтрокаКомментарий = ВыборкаДетальныеЗаписи.Комментарий;
            
        Массив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаКомментарий, "#");
        
        Макет.Параметры.Поле1 = Массив[0];
        Макет.Параметры.Поле2 = Массив[1];
        Макет.Параметры.Поле3 = Массив[2];
        
        ИтогКол = Ссылка.Товары.Итог("Количество");

        Макет.Параметры.Количество = ИтогКол;
        
        ;
    КонецЦикла;
    
        
    ТабДокумент.Вывести(Макет);
    ТабДокумент.АвтоМасштаб = Истина;
    
    ТабДокумент.Показать();
    
КонецФункции
   Mahazbek
 
15 - 26.03.19 - 15:58
Не удалось сформировать внешнюю печатную форму! Недостаточно фактических параметров
   edem911
 
16 - 26.03.19 - 16:02
(15)После подключения? есть реквизит СсылкаНаОбъект?
   edem911
 
17 - 26.03.19 - 16:04
(16) Если есть реквизит СсылкаНаОбъект, должно быть просто Печать() Экспорт, а вместо Ссылки использую СсылкаНаОбъект
   edem911
 
18 - 26.03.19 - 16:04
   Mahazbek
 
19 - 26.03.19 - 16:32
Спасибо, помогла замена ссылки на СсылкаНаОбъект!
Функция Печать() Экспорт
    
    ИмяМакета = "Макет";
        
    ТабДокумент = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет(ИмяМакета);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ПоступлениеТоваровУслуг.Ссылка,
        |    ПоступлениеТоваровУслуг.Номер,
        |    ПоступлениеТоваровУслуг.Дата,
        |    ПоступлениеТоваровУслуг.Контрагент,
        |    ПоступлениеТоваровУслуг.Комментарий,
        |    ВложенныйЗапрос.Количество
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
        |            СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК Количество,
        |            ПоступлениеТоваровУслугТовары.Ссылка КАК Ссылка
        |        ИЗ
        |            Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
        |        ГДЕ
        |            ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка
        |        
        |        СГРУППИРОВАТЬ ПО
        |            ПоступлениеТоваровУслугТовары.Ссылка) КАК ВложенныйЗапрос
        |        ПО ПоступлениеТоваровУслуг.Ссылка = ВложенныйЗапрос.Ссылка
        |ГДЕ
        |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);  
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Макет.Параметры.Номер = ВыборкаДетальныеЗаписи.Номер;
        Макет.Параметры.Дата = Формат(ВыборкаДетальныеЗаписи.Дата, "ДФ=dd.MM.yyyy");
        Макет.Параметры.Контрагент = ВыборкаДетальныеЗаписи.Контрагент;
        
        СтрокаКомментарий = ВыборкаДетальныеЗаписи.Комментарий;
            
        Массив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаКомментарий, "#");
        
        Макет.Параметры.Поле1 = Массив[0];
        Макет.Параметры.Поле2 = Массив[1];
        Макет.Параметры.Поле3 = Массив[2];
        
        ИтогКол = ВыборкаДетальныеЗаписи.Количество//СсылкаНаОбъект.Товары.Итог("Количество");


        Макет.Параметры.Количество = ИтогКол;
        
        
    КонецЦикла;
    
        
    ТабДокумент.Вывести(Макет);
    ТабДокумент.АвтоМасштаб = Истина;
    
    ТабДокумент.Показать();
    
КонецФункции
   Mahazbek
 
20 - 26.03.19 - 16:38
Здесь как-то можно сообщения редактировать, чтобы не плодить?
   edem911
 
21 - 26.03.19 - 17:46
(20) Нет, что написано на мисте(пером) не вырубишь топором)
   Mahazbek
 
22 - 27.03.19 - 10:49
Обнаружил, что форма не открывается, если комментарий не содержит решеток, либо пустой. Недостаточно фактических параметров.
   Ёпрст
 
23 - 27.03.19 - 11:04
(22)
 Массив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаКомментарий, "#");

 Для к = 1 ПО Массив.Количество() Цикл        
        Макет.Параметры["Поле"+к] = Массив[к-1];
 КонецЦикла;
   Mahazbek
 
24 - 27.03.19 - 11:32
(23) Вау, спасибо, помогло! Пытаюсь понять, как это работает )
   Mahazbek
 
25 - 08.04.19 - 08:39
ИтогКол = ВыборкаДетальныеЗаписи.Количество;
Макет.Параметры.Количество = ИтогКол;
        
Как-то можно всегда выводить количество в килограммах? В документах встречаются тонны и штуки.
   ДенисЧ
 
26 - 08.04.19 - 08:47
(25) Так возьми единицу и пересчитай по коэффицентам...


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует