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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        Макет.Параметры.Количество = ИтогКол;
        
        ;
    КонецЦикла;
    
        
    ТабДокумент.Вывести(Макет);
    ТабДокумент.АвтоМасштаб = Истина;
    
    ТабДокумент.Показать();
    
КонецФункции
15 Mahazbek
 
26.03.19
15:58
Не удалось сформировать внешнюю печатную форму! Недостаточно фактических параметров
16 edem911
 
26.03.19
16:02
(15)После подключения? есть реквизит СсылкаНаОбъект?
17 edem911
 
26.03.19
16:04
(16) Если есть реквизит СсылкаНаОбъект, должно быть просто Печать() Экспорт, а вместо Ссылки использую СсылкаНаОбъект
18 edem911
 
26.03.19
16:04
19 Mahazbek
 
26.03.19
16:32
Спасибо, помогла замена ссылки на СсылкаНаОбъект!

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

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