Строки в 1С 8.3 во встроенном языке 1с представляют собой значения примитивного типа Строка. Значения данного типа содержат строку в формате Unicode произвольной длины. Переменные строкового типа являются набором символов заключенных в кавычки.
Пример 1. Создадим строковую переменную с текстом.
СтроковаяПеременная = "Привет мир!";
Функции работы со строками в 1с 8.3
В данном разделе будут приведены основные функции, позволяющие изменять строки в 1с, либо анализировать информацию содержащуюся в них.
СтрДлина
СтрДлина(<Строка>). Возвращает количество символов содержащихся в строке, переданной в параметре.
Пример 2. Посчитаем количество символов в строке «Привет мир!».
Строка = "Привет мир!";
КоличествоСимволов = СтрДлина(Строка);
Сообщить(КоличествоСимволов);
Итогом выполнения данного кода будет вывод на экран количества символов строки: 11.
СокрЛ
СокрЛ(<Строка>). Отсекает незначащие символы, стоящие слева от первого значащего символа в строке.
Незначащие символы:
- пробел;
- неразрывный пробел;
- табуляция;
- возврат каретки;
- перевод строки;
- перевод формы (страницы).
Пример 3. Убрать все пробелы с левой стороны строки » мир!» и присоединить к ней строку «Привет «.
Строка = СокрЛ(" мир!");
Строка = "Привет "+Строка;
Сообщить(Строка);
Итогом выполнения данного кода будет вывод на экран строки «Привет мир!».
СокрП
СокрП(<Строка>). Отсекает незначащие символы, стоящие справа от первого значащего символа в строке.
Пример 4. Сформировать из строк «Привет » и » мир!» фразу «Привет мир!»
Строка = СокрП("Привет ") + " " + СокрЛ(" мир!");
Сообщить(Строка);
СокрЛП
СокрЛП(<Строка>). Отсекает незначащие символы, стоящие справа от первого значащего символа в строке, также отсекает незначащие символы, стоящие слева от первого значащего символа в строке. Данная функция используется чаще предыдущих двух, так как она более универсальна.
Пример 5. Убрать незначащие символы стоящие слева и справа в наименовании контрагента.
Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "0777121211");
КонтрагентОбъект = Контрагент.ПолучитьОбъект();
КонтрагентОбъект.Наименование = СокрЛП(КонтрагентОбъект.Наименование);
КонтрагентОбъект.Записать();
Лев
Лев(<Строка>, <ЧислоСимволов>). Получает первые символы строки, число символов указывается в параметре ЧислоСимволов. Если указанное количество символов превышает длину строки, то возвращается вся строка.
Пример 6. Пусть в структуре Сотрудник содержаться имя, фамилия и отчество сотрудника. Получить строку с фамилией и инициалами.
ИнициалИмени = Лев(Сотрудник.Имя, 1);
ИнициалОтчества = Лев(Сотрудник.Отчество, 1);
ПолноеИмя = Сотрудник.Фамилия + " "
+ ИнициалИмени + "."
+ ИнициалОтчества + ".";
Прав
Прав(<Строка>, <ЧислоСимволов>). Получает последние символы строки, число символов указывается в параметре ЧислоСимволов. Если указанное количество символов превышает длину строки, то возвращается вся строка.
Пример 7. Пусть в конце строковой переменной записана дата в формате «ггггммдд», получить строку с датой и преобразовать ее к типу Дата.
Строка = "Текущая дата: 20170910";
СтрокаДата = Прав(Строка, 8);
Дата = Дата(СтрокаДата);
Сред
Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>). Получает подстроку из строки переданной в параметре Строка, начиная с символа номер которого указан в параметре НачальныйНомер и длиной переданной в параметр ЧислоСимволов. Нумерация символов в строке начинается с 1. Если в параметре НачальныйНомер указано значение, меньшее или равное нулю, то параметр принимает значение 1. Если параметр ЧислоСимволов не указан, то выбираются символы до конца строки.
Пример 8. Пусть в строковой переменной начиная с девятой позиции содержится код региона, следует получить его и записать в отдельную строку.
Строка = "Регион: 99 г. Москва";
Регион = Сред(Строка, 9, 2);
СтрНайти
СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>). Осуществляет поиск указанной подстроки в строке, возвращает номер позиции первого символа найденной подстроки. Рассмотрим параметры данной функции:
- Строка. Исходная строка;
- ПодстрокаПоиска. Искомая подстрока;
- НаправлениеПоиска. Указывает направление поиска подстроки в строке. Может принимать значения:
- НаправлениеПоиска.СНачала;
- НаправлениеПоиска.СКонца;
- НачальнаяПозиция. Указывает позицию в строке, с которой начинается поиск;
- НомерВхождения. Указывает номер вхождения искомой подстроки в исходной строке.
Пример 9. В строке «Привет мир!» определить позицию последнего вхождения символа «и».
НомерПозиции = СтрНайти("Привет мир!", "и", НаправлениеПоиска.СКонца);
Сообщить(НомерПозиции);
Итогом выполнения данного кода будет вывод на экран номера последнего вхождения символа «и»: 9.
ВРег
ВРег(<Строка>). Преобразует все символы указанной строки в 1с 8 к верхнему регистру.
Пример 10. Преобразовать строку «привет мир!» к верхнему регистру.
СтрокаВрег = ВРег("привет мир!");
Сообщить(СтрокаВрег);
Итогом выполнения данного кода будет вывод на экран строки «ПРИВЕТ МИР!»
НРег
НРег(<Строка>). Преобразует все символы указанной строки в 1с 8 к нижнему регистру.
Пример 11. Преобразовать строку «ПРИВЕТ МИР!» к нижнему регистру.
СтрокаНрег = НРег("ПРИВЕТ МИР!");
Сообщить(СтрокаВрег);
Итогом выполнения данного кода будет вывод на экран строки «привет мир!»
ТРег
ТРег(<Строка>). Преобразует строку следующим образом: первый символ каждого слова переводится в верхний регистр, остальные символы слова переводятся в нижний регистр.
Пример 12. Сделать заглавными первые буквы слов в строке «привет мир!».
СтрокаТрег = ТРег("привет мир!");
Сообщить(СтрокаТрег);
Итогом выполнения данного кода будет вывод на экран строки «Привет Мир!»
Символ
Символ(<КодСимвола>). Получает символ по его коду в кодировке Unicod.
Пример 13. Добавим слева и справа в строку «Привет Мир!» символ ★
СимволЗвезда = Символ("9733");
СтрокаСоЗвездами = СимволЗвезда + "Привет Мир!" + СимволЗвезда;
Сообщить(СтрокаСоЗвездами);
Итогом выполнения данного кода будет вывод на экран строки «★Привет Мир!★»
КодСимвола
КодСимвола(<Строка>, <НомерСимвола>). Получает код символа в кодировке Unicode из строки указанной в первом параметре, расположенного в позиции указанной во втором параметре.
Пример 14. Узнать код последнего символа в строке «Привет Мир!».
Строка = "Привет Мир!";
КодСимвола = КодСимвола(Строка, СтрДлина(Строка));
Сообщить(КодСимвола);
Итогом выполнения данного кода будет вывод на экран кода символа «!» — 33.
ПустаяСтрока
ПустаяСтрока(<Строка>). Проверяет состоит ли строка только из незначащих символов, то есть является ли она пустой.
Пример 15. Проверить является ли пустой строка состоящая из трех пробелов.
Пустая = ПустаяСтрока(" ");
Сообщить(Пустая);
Итогом выполнения данного кода будет вывод на экран слова «Да» (строковое выражение логического значения Истина).
СтрЗаменить
СтрЗаменить(<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>). Находит в исходной строке все вхождения подстроки поиска и заменяет ее на подстроку замены.
Пример 16. В строке «Привет Мир!» заменить слово «Мир» на слово «Друзья».
Строка = СтрЗаменить("Привет Мир!", "Мир", "Друзья");
Сообщить(Строка);
Итогом выполнения данного кода будет вывод на экран строки «Привет Друзья!»
СтрЧислоСтрок
СтрЧислоСтрок(<Строка>). Позволяет посчитать количество строк в многострочной строке. Для перехода на новую строку в 1с 8 используется символ ПС (символ перевода строки).
Пример 17. Определить число строк в тексте:
«Первая строка
Вторая строка
Третья строка»
Число = СтрЧислоСтрок("Первая строка
|Вторая строка
|Третья строка");
Сообщить(Число);
Итогом выполнения данного кода будет вывод на экран количества строк в тексте: 3
СтрПолучитьСтроку
СтрПолучитьСтроку(<Строка>, <НомерСтроки>). Получает строку в многострочной строке по ее номеру. Нумерация строк начинается с 1.
Пример 18. Получить последнюю строку в тексте:
«Первая строка
Вторая строка
Третья строка»
Текст = "Первая строка
|Вторая строка
|Третья строка";
ПоследняяСтрока = СтрПолучитьСтроку(Текст, СтрЧислоСтрок(Текст));
Сообщить(ПоследняяСтрока);
Итогом выполнения данного кода будет вывод на экран строки «Третья строка».
СтрЧислоВхождений
СтрЧислоВхождений(<Строка>, <ПодстрокаПоиска>). Возвращает число вхождений указанной подстроки в строку. Функция чувствительна к регистру.
Пример 19. Определить сколько раз входит в строку «Строки в 1с 8.3 и 8.2» буква «с», вне зависимости от ее регистра.
Строка = "Строки в 1с 8.3 и 8.2";
ЧислоВхождений = СтрЧислоВхождений(Врег(Строка), "С");
Сообщить(ЧислоВхождений);
Итогом выполнения данного кода будет вывод на экран числа вхождений: 2.
СтрНачинаетсяС
СтрНачинаетсяС(<Строка>, <СтрокаПоиска>). Проверяет начинается ли строка переданная в первом параметре, со строки во втором параметре.
Пример 20. Определить начинается ли ИНН выбранного контрагента с цифры 1. Пусть в переменной Контрагент хранится ссылка на элемент справочника Контрагенты.
ИНН = Контрагент.ИНН;
НачинаетсяСЕдиницы = СтрНачинаетсяС(ИНН, "1");
Если НачинаетсяСЕдиницы Тогда
//Ваш код
КонецЕсли;
СтрЗаканчиваетсяНа
СтрЗаканчиваетсяНа(<Строка>, <СтрокаПоиска>). Проверяет заканчивается ли строка переданная в первом параметре, на строку во втором параметре.
Пример 21. Определить заканчивается ли ИНН выбранного контрагента на цифру 2. Пусть в переменной Контрагент хранится ссылка на элемент справочника Контрагенты.
ИНН = Контрагент.ИНН;
ЗаканчиваетсяНаДвойку = СтрЗаканчиваетсяНа(ИНН, "2");
Если ЗаканчиваетсяНаДвойку Тогда
//Ваш код
КонецЕсли;
СтрРазделить
СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>). Разделяет строку на части по указанным символам-разделителям и записывает полученные строки в массив. В первом параметре хранится исходная строка, во втором строка содержащая разделитель, в третьем указывается, нужно ли записывать в массив пустые строки (по умолчанию Истина).
Пример 22. Пусть у нас есть строка содержащая числа разделенные символом «;», получить из строки массив чисел.
Строка = "1; 2; 3";
Массив = СтрРазделить(Строка, ";");
Для Сч = 0 По Массив.Количество() - 1 Цикл
Попытка
Массив[Сч] = Число(СокрЛП(Массив[Сч]));
Исключение
Массив[Сч] = 0;
КонецПопытки;
КонецЦикла;
В результате выполнения будет получен массив с числами от 1 до 3-х.
СтрСоединить
СтрСоединить(<Строки>, <Разделитель>). Преобразует массив строк из первого параметра в строку, содержащую все элементы массива через разделитель, указанный во втором параметре.
Пример 23. Используя массив чисел из предыдущего примера, получить исходную строку.
Для Сч = 0 По Массив.Количество() - 1 Цикл
Массив[Сч] = Строка(Массив[Сч]);
КонецЦикла;
Строка = СтрСоединить(Массив, "; ");
Также прочитать про строковые функции появившиеся в 8.3 можно на официальном сайте 1С: v8.1c.ru
Прочитайте статью про работу с числами: Число в 1С 8.3 — функции работы с числами
Возвращает первое или очередное вхождение подстроки в исходную строку.
Синтаксис
Функция СтрНайти()
имеет следующий синтаксис:
Число СтрНайти(ИсходнаяСтрока, ПодстрокаПоиска, [НаправлениеПоиска], [НачальнаяПозиция], [НомерВхождения])
А также альтернативный англоязычный синтаксис:
number StrFind(SourceString, Substring, [Direction], [StartPos], [MatchNumber])
Параметры
Описание параметров функции СтрНайти()
:
Имя параметра* | Тип | Описание | ||||
---|---|---|---|---|---|---|
ИсходнаяСтрока | Строка | Исходная строка. | ||||
ПодстрокаПоиска | Строка | Искомая подстрока. | ||||
НаправлениеПоиска | НаправлениеПоиска | Указывает направление поиска подстроки в строке. Возможные значения:
Значение по умолчанию: |
||||
НачальнаяПозиция | Число | Указывает позицию в строке, с которой начинается поиск. Если параметр не задан и задано направление НаправлениеПоиска.СНачала , то значение по умолчанию равно 1. |
||||
НомерВхождения | Число | Указывает порядковый номер вхождения подстроки в исходной строке. Значение по умолчанию: 1 (ищется первое вхождение) | ||||
*Жирным шрифтом выделены обязательные параметры |
Возвращаемое значение
Число
— позиция первого символа найденной подстроки.
Описание
Функция СтрНайти()
находит требуемое вхождение подстроки поиска с начала или с конца исходной строки. Нумерация символов в строке начинается с 1. Если строка не содержит указанной подстроки, то возвращается 0. Если параметр ПодстрокаПоиска
является пустой строкой, то возвращается 1. Если оба обязательных параметра являются пустыми строками, возвращается 1.
Внимание! Поиск выполняется с учетом регистра, аналогично устаревшей функции Найти()
.
Внимание!! В том случае, если Вы используете релиз платформы 1С:Предприятие 8.3.5 и ниже (либо аналогичный режим совместимости конфигурации), функция работать не будет. При попытке сохранить модуль вы получите ошибку: «Функция СтрНайти() не определена!»
Доступность
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер), интеграция.
Пример использования
Пример кода с использованием функции СтрНайти()
:
ИсходнаяСтрока = "Заголовок: прочие товары"; Рез = СтрНайти(ИсходнаяСтрока, "заголовок:"); //Рез = 0, т.к. поиск регистрозависимый //регистронезависимый поиск: Рез = СтрНайти(нрег(ИсходнаяСтрока), "заголовок:"); //Рез = 1 //поиск значений, расположенных в конце строк стал удобнее ИсходнаяСтрока = "Значение: Стул комнатный Значение: 1"; Рез = СтрНайти(нрег(ИсходнаяСтрока), "значение:", НаправлениеПоиска.СКонца);
Читайте также:
Ошибка «Функция СтрНайти() не определена»
Поделиться страницей в соц.сетях
Метки: Метки 1C:Предприятие 8.3.6+
Иногда бывает необходимо получить последние или первые строки табличных частей нескольких элементов (документов, справочников и т.п.) Проблема в том, что у разных элементов может быть разное количество строк в табличной части, поэтому получить нужную строку по номеру не получится, а использовать сортировку и ВЫБРАТЬ ПЕРВЫЕ 1 зачастую нельзя.
Рассмотрим пример. В запросе, который получает данные из документов Приобретение товаров и услуг необходимо получить поле с адресом контрагента. В новых версиях конфигураций 1С контактная информация контрагентов хранится в табличной части справочника. В этой табличной части хранятся не только актуальные адреса, но история.
Таким образом, нужно получить последнюю строку из табличной части КонтактнаяИнформация справочника Контрагенты, удовлетворяющую определенным условиям. И соединить полученную таблицу с таблицей документа Приобретение товаров и услуг. При этом нельзя, чтобы в таблице с адресами на каждого контрагента было больше одной строки, иначе при соединении с таблицей документа мы получим дублирующиеся строки.
Итак, для начала получим номер строки актуального адреса:
«ВЫБРАТЬ
| МАКСИМУМ(КонтрагентыКонтактнаяИнформация.НомерСтроки) КАК НомерСтроки,
| КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
|ГДЕ
| КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
| КонтрагентыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)
|СГРУППИРОВАТЬ ПО
| КонтрагентыКонтактнаяИнформация.Ссылка»
Здесь мы выбираем из табличной части справочника Контрагенты строки, удовлетворяющие условиям (в этой табличной части могут быть не только адреса), а потом с помощью группировки получаем максимальный номер строки. Это и будет последний актуальный адрес.
Теперь поместим результат этого запроса во временную таблицу и с ее помощью получим сам адрес.
«ВЫБРАТЬ
| МАКСИМУМ(КонтрагентыКонтактнаяИнформация.НомерСтроки) КАК НомерСтроки,
| КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка
|ПОМЕСТИТЬ НомерСтрокиАдреса
|ИЗ
| Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
|ГДЕ
| КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
| КонтрагентыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)
|СГРУППИРОВАТЬ ПО
| КонтрагентыКонтактнаяИнформация.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка,
| КонтрагентыКонтактнаяИнформация.Представление КАК Представление
|ИЗ
| НомерСтрокиАдреса КАК НомерСтрокиАдреса
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
| ПО (КонтрагентыКонтактнаяИнформация.Ссылка = НомерСтрокиАдреса.Ссылка)
| И НомерСтрокиАдреса.НомерСтроки = КонтрагентыКонтактнаяИнформация.НомерСтроки»
Здесь мы для каждого контрагента выбрали по номеру строки, полученному в предыдущем запросе, один адрес.
Теперь опять поместим полученный результат во временную таблицу и соединим ее с запросом к документу. В результате получим интересующий нас запрос.
«ВЫБРАТЬ
| МАКСИМУМ(КонтрагентыКонтактнаяИнформация.НомерСтроки) КАК НомерСтроки,
| КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка
|ПОМЕСТИТЬ НомерСтрокиАдреса
|ИЗ
| Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
|ГДЕ
| КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
| КонтрагентыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)
|СГРУППИРОВАТЬ ПО
| КонтрагентыКонтактнаяИнформация.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка,
| КонтрагентыКонтактнаяИнформация.Представление КАК Представление
|ПОМЕСТИТЬ Адреса
|ИЗ
| НомерСтрокиАдреса КАК НомерСтрокиАдреса
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
| ПО (КонтрагентыКонтактнаяИнформация.Ссылка = НомерСтрокиАдреса.Ссылка)
| И НомерСтрокиАдреса.НомерСтроки = КонтрагентыКонтактнаяИнформация.НомерСтроки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПриобретениеТоваровУслугТовары.Ссылка.Контрагент.НаименованиеПолное КАК ФизическоеЛицоОрганизация,
| КонтрагентыКонтактнаяИнформация.Представление КАК СведенияОКонтрагенте,
| ПриобретениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
| ПриобретениеТоваровУслугТовары.Количество КАК Количество,
| ПриобретениеТоваровУслугТовары.Цена КАК Цена,
| ПриобретениеТоваровУслугТовары.Сумма КАК Сумма,
| ПриобретениеТоваровУслугТовары.СуммаСНДС КАК СуммаСНДС,
|ИЗ
| Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Адреса КАК КонтрагентыКонтактнаяИнформация
| ПО (ПриобретениеТоваровУслугТовары.Ссылка.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка)
|ГДЕ
| ПриобретениеТоваровУслугТовары.Ссылка.Проведен
| И ПриобретениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода»
Таблица значений. Получить последнюю строку |
Я |
13.07.16 — 08:39
Здравствуйте.
Имею таблицу значений (Результат запроса).
Номенклатура
Характеристика
Цена
ЦенаСтарая
Результат = Запрос.Выполнить().Выгрузить();
В ней всегда 3 последние записи периодического РС. Скажите как можно быстро получать(оставить)только последнюю запись в ТЗ по индексу(он максимальный ВСЕГДА), не хочется циклить.
1 — 13.07.16 — 08:43
Результат.Получить(Результат.Количество()-1)
2 — 13.07.16 — 08:43
правда это жуткий г0внокод)) надо в запросе это делать сразу))
3 — 13.07.16 — 08:44
(0) ВЫБРАТЬ ПЕРВЫЕ 1 УПОРЯДОЧИТЬ по УБЫВ
4 — 13.07.16 — 08:46
В запросе я не могу этого сделать там несколько ТЗ по связям.
5 — 13.07.16 — 08:47
(4) продолжайте наблюдение
6 — 13.07.16 — 08:48
В итоговой таблице только, Можно по циклу. Можно обратно в ТЗ. Сложновато как то тогда
7 — 13.07.16 — 08:49
(6) «..по циклу..» — не бери такого греха на душу, сын мой (вспоминая недавнюю тему про крестного отца)))
8 — 13.07.16 — 09:00
(1) особенно прикольно это выполнить если результат пустой будет:). А нафига именно последнюю запись, а не первую или 5-ю, может все остальные и не нужно выбирать, отборы в запросе какие нить установить:)
9 — 13.07.16 — 09:02
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЦеныНоменклатуры.Период КАК Период,
ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
ЦеныНоменклатуры.Цена КАК Цена,
ЦеныНоменклатуры.Валюта КАК Валюта,
ЦеныНоменклатуры.ЕдиницаИзмерения КАК ЕдиницаИзмерения
ПОМЕСТИТЬ ВТЦеныНоменклатуры
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатуры
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЦеныНоменклатуры.Период КАК Период,
ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
ЦеныНоменклатуры.Цена КАК Цена,
ЦеныНоменклатуры.Валюта КАК Валюта,
МАКСИМУМ(ЦеныНоменклатуры.ЕдиницаИзмерения) КАК ЕдиницаИзмерения
ИЗ
(ВЫБРАТЬ
ЦеныНоменклатуры.Период КАК Период,
ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
ЦеныНоменклатуры.Цена КАК Цена,
МАКСИМУМ(ЦеныНоменклатуры.Валюта) КАК Валюта
ИЗ
(ВЫБРАТЬ
ЦеныНоменклатуры.Период КАК Период,
ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
МАКСИМУМ(ЦеныНоменклатуры.Цена) КАК Цена
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
ЦеныНоменклатуры.Номенклатура КАК Номенклатура
ИЗ
ВТЦеныНоменклатуры КАК ЦеныНоменклатуры
СГРУППИРОВАТЬ ПО
ЦеныНоменклатуры.Номенклатура) КАК МаксимальныйПериод
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО МаксимальныйПериод.Период = ЦеныНоменклатуры.Период
И МаксимальныйПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура
СГРУППИРОВАТЬ ПО
ЦеныНоменклатуры.Период,
ЦеныНоменклатуры.Номенклатура) КАК ПоследняяЦена
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО ПоследняяЦена.Период = ЦеныНоменклатуры.Период
И ПоследняяЦена.Номенклатура = ЦеныНоменклатуры.Номенклатура
И ПоследняяЦена.Цена = ЦеныНоменклатуры.Цена
СГРУППИРОВАТЬ ПО
ЦеныНоменклатуры.Период,
ЦеныНоменклатуры.Номенклатура,
ЦеныНоменклатуры.Цена) КАК ПоследняяВалюта
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО ПоследняяВалюта.Период = ЦеныНоменклатуры.Период
И ПоследняяВалюта.Номенклатура = ЦеныНоменклатуры.Номенклатура
И ПоследняяВалюта.Цена = ЦеныНоменклатуры.Цена
И ПоследняяВалюта.Валюта = ЦеныНоменклатуры.Валюта
СГРУППИРОВАТЬ ПО
ЦеныНоменклатуры.Период,
ЦеныНоменклатуры.Номенклатура,
ЦеныНоменклатуры.Цена,
ЦеныНоменклатуры.Валюта
10 — 13.07.16 — 09:03
Вообще странно, у вас случаем не по 3 характеристики к номенклатуре есть, почему всегда 3 записи то:)
11 — 13.07.16 — 09:03
(9) тут точно будет последняя цена
12 — 13.07.16 — 09:04
(8) Умник) ну, наверное надо проверить, я ж не буду учить этому автора. И всё остальное уже обсудили. Выскочил тут)
13 — 13.07.16 — 09:05
(0) делай выбор последнего индекса в таблице по аналогии с (9)
14 — 13.07.16 — 09:07
(9) хороший код для показа радуги
15 — 13.07.16 — 09:08
максимум по единице измерения и валюте, так вообще шедевр, впрочем, как и весь код
16 — 13.07.16 — 09:10
На пустой результат есть
Результат.Количество() > 0
Три потому, что бланк имеет две формы в одной надо выводить 3 по втором 1 последнюю.
novichok79 спасибо на мысль Период РС будет минимальным это наверное и будет решением попробую сейчас
17 — 13.07.16 — 09:11
(0) >3 записи
>не хочется циклить
О боже, горе от ума.
Результат.Удалить(0);
Результат.Удалить(0);
Так лучше?
18 — 13.07.16 — 09:12
(17) Убил
19 — 13.07.16 — 09:15
Вопрос решен через ПЕРИОД минимальный. СПАСИБО за участие.
novichok79
20 — 13.07.16 — 09:17
(14) обычно хватает максимальной цены. тут я переборщил конечно.
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
&НаКлиенте Процедура ВыполнитьКод(Команда) /// Как найти длину строки в 1с 8.3, 8.2 Сообщить(СтрДлина("123456789")); // 9 /// Как взять часть строки в 1с 8.3, 8.2 // как взять N символов слева Строка = "Иван Грозный"; Сообщить(Лев(Строка, 4)); // Иван // как взять N символов справа Строка = "Иван Грозный"; Сообщить(Прав(Строка, 7)); // Грозный // как взять строку из середины Строка = "Мама, папа, я."; // возьмём начиная с 7 индекса 4 символа Сообщить(Сред(Строка, 7, 4)); // папа /// Как найти подстроку в 1с 8.3, 8.2 Строка = "Привет, мир!"; Индекс = СтрНайти(Строка, "Привет"); // 1, строки индексируются с единицы /// Как узнать число вхождений подстроки в строку в 1с 8.3, 8.2 Сообщить(СтрЧислоВхождений("я, я и ещё раз я.", "я")); // 3 /// Как заменить подстроку в строке в 1с 8.3, 8.2 Сообщить(СтрЗаменить("Идёт сильный дождь.", "дождь", "снег")); /// Как проверить на пустую строку в 1с 8.3, 8.2 Если ПустаяСтрока(" ") Тогда Сообщить("Строка пустая, то есть не содержит значащих символов."); КонецЕсли; /// Как удалить незначащие символы из строки в 1с 8.3, 8.2 // слева Сообщить(СокрЛ(" из лесу ёлочку ")); // "из лесу ёлочку " // справа Сообщить(СокрП(" из лесу ёлочку ")); // " из лесу ёлочку" // с двух сторон Сообщить(СокрЛП(" из лесу ёлочку ")); // "из лесу ёлочку" /// Как вставить в строку перенос в 1с 8.3, 8.2 Строка = "Первая строка" + Символы.ПС + "Вторая строка" + Символы.ПС + "Третья строка"; /// Как работать с многострочными строками (нумерация с /// единицы) в 1с 8.3, 8.2 Сообщить(СтрЧислоСтрок(Строка)); // 3 Сообщить(СтрПолучитьСтроку(Строка, 2)); // "Вторая строка" /// Верхний, нижний и титульный регистры в 1с 8.3, 8.2 Сообщить(ВРег("россия - родина моя!")); // РОССИЯ - РОДИНА МОЯ! Сообщить(НРег("МИР, ТРУД, МАЙ!")); // мир, труд, май Сообщить(ТРег("мама мыла раму")); // Мама Мыла Раму /// Как получить код символа строки в 1с 8.3, 8.2 // код отдельного символа: // туда Сообщить(КодСимвола("A")); // 65 // и обратно Сообщить(Символ(65)); // "A" // код третьего символа в строке Сообщить(КодСимвола("ABC", 3)); //67 // код первого символа в строке КодПервогоСимволаФамилии = КодСимвола("Грозный"); Сообщить(КодПервогоСимволаФамилии); // 1043, потому что Unicode. /// Как преобразовать строку в число в 1с 8.3, 8.2 Сообщить(Число("125.36")); // 125,36 Сообщить(Число("125,36")); // 125,36 /// Как преобразовать число в строку в 1с 8.3, 8.2 Сообщить(25 + "10"); // 35 // если же нужно сложить число и строку как строки Сообщить(Строка(25) + "10"); // 2510 /// Как разбить строку с разделителями в 1с 8.3, 8.2 Разделитель = ","; Строки = СтрЗаменить("январь, февраль, март", Разделитель, Символы.ПС); Для Индекс = 1 По СтрЧислоСтрок(Строки) Цикл Сообщить(СтрПолучитьСтроку(Строки, Индекс)); КонецЦикла; КонецПроцедуры &НаСервереБезКонтекста Процедура ВыполнитьКодНаСервере() /// Как сериализовать значение в строку в 1с 8.3, 8.2 Массив = Новый Массив(3); Массив[0] = 1; Массив[1] = "Земля"; Массив[2] = 3.14; Стр = ЗначениеВСтрокуВнутр(Массив); Сообщить(Стр); //{"#",51e7a0d2-530b-11d4-b98a-008048da3034, // {3, // {"N",1}, // {"S","Земля"}, // {"N",3.14} // } //} /// Как десериализовать значение из строки в 1с 8.3, 8.2 МассивКопия = ЗначениеИзСтрокиВнутр(Стр); Элемент = МассивКопия[1]; Сообщить(Элемент); // Земля КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере