Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 апр 2024, 12:05

Поиск свободного числа в диапозоне

Автор LastShine, 06 ноя 2015, 09:45

0 Пользователей и 1 гость просматривают эту тему.

LastShine

Нужна помощь. Суть дела такова есть номера карточек в справочнике, от 1 до 9999, потом когда все номера используются и часть удаляется по определенному критерию. Какой должен быть алгоритм, что при создании новой записи в справочнике автоматически искалось следующее свободное значение после последеего записанного и вписывалось в элемент.

Vladimir_Sh

LastShine, сложно конечно сказать не зная логики освобождения номеров, но может наведу на мысль:)
С помощью запроса выберите все номера, далее в нем же получите признак (некое поле Булево) какие из них заняты поставьте условие и отсортируйте. Если позволяет структура данных сразу получайте не занятые, а далее уже делайте как считаете нужным: получайте первую/последнюю запись, отбирайте и т.д.
Если я Вам помог, нажми - Спасибо!

LastShine

Цитата: Vladimir_Sh от 06 ноя 2015, 10:07
LastShine, сложно конечно сказать не зная логики освобождения номеров, но может наведу на мысль:)
С помощью запроса выберите все номера, далее в нем же получите признак (некое поле Булево) какие из них заняты поставьте условие и отсортируйте. Если позволяет структура данных сразу получайте не занятые, а далее уже делайте как считаете нужным: получайте первую/последнюю запись, отбирайте и т.д.
Наверное так не получится потому что удаляется вся строка а не только элемент с номером. Условие очищение такого, у этой карточки когда поручение по ней выполнено, проставляется дата,  после все карточки у которых поле дата исполнения заполнены удаляются. И надо что бы на их места писались новые)


vitasw

В качестве идеи:
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Нумератор",Новый ОписаниеТипов("Число"));

Для ее=1 По 99999 Цикл
НовСтрока=ТЗ.Добавить();
НовСтрока.Нумератор=ее;
КонецЦикла;


Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    | ТЗ.Нумератор КАК Нумератор
    |ПОМЕСТИТЬ Таб
    |ИЗ
    | &ТЗ КАК ТЗ
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ВЫБОР
    | КОГДА Клиенты.Код ЕСТЬ NULL
    | ТОГДА ЛОЖЬ
    | ИНАЧЕ ИСТИНА
    | КОНЕЦ КАК НомерЗанят,
    | Таб.Нумератор
    |ПОМЕСТИТЬ вт1
    |ИЗ
    | Таб КАК Таб
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Клиенты КАК Клиенты
    | ПО Таб.Нумератор = Клиенты.Код
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | МИНИМУМ(вт1.Нумератор) КАК Нумератор
    |ИЗ
    | вт1 КАК вт1
    |ГДЕ
    | НЕ вт1.НомерЗанят";

LastShine

Цитата: vitasw от 06 ноя 2015, 10:34
В качестве идеи:
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Нумератор",Новый ОписаниеТипов("Число"));

Для ее=1 По 99999 Цикл
НовСтрока=ТЗ.Добавить();
НовСтрока.Нумератор=ее;
КонецЦикла;
Это интересно, попробую, спасибо

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    | ТЗ.Нумератор КАК Нумератор
    |ПОМЕСТИТЬ Таб
    |ИЗ
    | &ТЗ КАК ТЗ
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ВЫБОР
    | КОГДА Клиенты.Код ЕСТЬ NULL
    | ТОГДА ЛОЖЬ
    | ИНАЧЕ ИСТИНА
    | КОНЕЦ КАК НомерЗанят,
    | Таб.Нумератор
    |ПОМЕСТИТЬ вт1
    |ИЗ
    | Таб КАК Таб
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Клиенты КАК Клиенты
    | ПО Таб.Нумератор = Клиенты.Код
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | МИНИМУМ(вт1.Нумератор) КАК Нумератор
    |ИЗ
    | вт1 КАК вт1
    |ГДЕ
    | НЕ вт1.НомерЗанят";


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск