Я давно задумывался над вопросом, как из ничего получаются килограммы. Но не в том смысле, что надо меньше жрать, а в том, как уложить рюкзак, чтобы хватило сил поднять его. Да и не только рюкзак.
В итоге, как водится, решил задачу с помощью таблички в Экселе. А также линейки и весов. Посмотрел на результат – и решил ходить в походы на машине. Лучше на большой.
Однако задача не давала покоя. Сама ведь просится в базу данных. Но что-то останавливало меня каждый раз. Главным образом, руки не доходили.
Было еще вот какое соображение. Такая база нужна дома, а там я пользуюсь учебной версией платформы. Для каких-нибудь мелочей ее хватает, а как что-то серьезное делать, так упираешься в искусственные ограничения.
Да-да, я уже слышу хохот за монитором. Представьте себе туриста, у которого список вещей не влез в две тысячи позиций. Сами понимаете, гора чемоданов, туземные носильщики, джунгли зовут. По-другому в Африку не ходят гулять.
Однако ж на практике список предметов, которые так и норовят оказаться в вашем рюкзаке или чемодане в зависимости от сезона и прочих обстоятельств, почему-то растет с угрожающей быстротой. Так что задуматься о длине списков нужно заранее.
Вдобавок есть очевидные моменты, о которых не вспоминаешь, пока что-нибудь нужное не забудешь. Даже если в списке три десятка вещей, лучший способ не упустить ничего из виду – ставить галочки на бумажной распечатке. А печать-то в учебной платформе не поддерживается. Придется действовать обходными путями.
В общем, в Экселе я ни с чем таким не сталкивался и потихоньку, год за годом, пополнял таблицу, измеряя и взвешивая, измеряя и взвешивая, измеряя и взвешивая…
А потом сказал себе «Соберись, тряпка!» и сделал конфигурацию в 1С. Называется «Рюкзачок».
Итак, наполненный рюкзак, набитый чемодан или багажник машины, заваленный вещами, в терминах конфигурации называется укладкой. Любая укладка собирается из вещей, перечисленных в общем списке предметов. Заранее вы будете наполнять его или по ходу дела, решите сами.
Кстати, рюкзаки, чемоданы, сумки и т.д. тоже должны быть в списке предметов. Как поступить с багажником или прицепом, даже и не знаю. Придумайте что-нибудь.
Во избежание недоразумений лучше сразу договориться о терминах. Укладка – это обособленный структурированный список предметов, выбранных с определенной целью из списка доступных предметов. То есть каждая укладка набирается из того, что есть, решает поставленную задачу и ничего не знает о других укладках.
Любой предмет в списке доступных предметов может быть объявлен контейнером, и тогда можно помещать в него другие предметы, в том числе другие контейнеры и другие укладки. Вложенные укладки присутствуют на правах не то предметов, не то контейнеров, смотря по обстоятельствам. В любом случае они становятся частями структурированного списка.
Ну так вот, пустой рюкзак – это контейнер, пустая аптечка – тоже контейнер, пустая коробка для блесен – тем более контейнер. Считать ли контейнером коробок спичек или тюбик зубной пасты – ваше личное дело. Где-то все равно придется остановиться.
По идее, любая укладка сама содержится в каком-нибудь контейнере. Он так и называется – контейнер укладки. Но можно обойтись и без него. Конфигурация позволяет собрать укладку в виде кучи, бесформенной, но не безразмерной.
Вообще-то, объявление предмета контейнером означает, что у него есть доступное внутреннее пространство, которое характеризуется размерами, объемом, формой. Самое важное, что внутренние размеры и объем контейнера являются ограничениями на размеры и объем вложенных предметов, а применение этих ограничений зависит от типа контейнера.
Более того, внутренние размеры и объем могут быть никак не связаны с внешними. То есть в качестве внешних можно указать размеры контейнера в сложенном виде, а в качестве внутренних – в расправленном. Вдобавок внутренний объем никак не связан с внутренними размерами, хотя по умолчанию вычисляется, исходя из размеров и формы.
Например, у любых контейнеров для жидкостей, то есть канистр, фляг, бутылок, снаружи важны линейные размеры, а внутри – только емкость. Как она связана с наружными размерами – вовсе неочевидно из-за формы контейнера, а внутренние размеры вообще никому не интересны. Кроме тех, кто делает кораблики в бутылках.
Еще одна особенность конфигурации – учет количества предметов. По умолчанию каждый предмет в общем списке считается уникальным и единственным. Однако ничто не мешает указать количество одинаковых предметов. Или перечислить их каждый по отдельности. То же самое можно делать в укладке. В любом случае конфигурация не позволит набрать больше предметов, чем есть.
Но можно попросить не учитывать количество. Допустим, в списке есть шариковая ручка. Самая обыкновенная, за три копейки. Лично я понятия не имею, сколько таких ручек у меня дома. Тогда можно поставить галочку «Не проверять количество» и раскладывать одну и ту же условную ручку хоть по всем карманам. Если в реальности не хватит, придется идти в магазин за ручками.
Есть и другой аспект учета. Количество предметов контролируется только в пределах укладки. Конфигурация не может знать, существуют ли разные укладки одновременно в реальности или только в виде списков. Предполагается, что каждая укладка существует сама по себе и не конкурирует с другими за предметы.
Но как только одна укладка помещается в другую, она оказывается в составе другой укладки, так что количество ее предметов тоже идет в зачет. Например, если у вас всего один градусник, и он уложен по отдельности в аптечку и чемодан, попытка уложить аптечку в чемодан не удастся именно из-за лишнего градусника. Точно так же не удастся взять с собой две разные аптечки, в которые положен один и тот же единственный градусник.
Кстати, некорректное вложение контейнеров в самих себя предотвращается как раз через проверку количества одинаковых предметов и сопоставление размеров. Надо иметь в виду, что это не проверка на зацикливание вложенности, ведь контейнер всегда добавляется пустым в отличие от вложенной укладки. Проверяется именно превышение ограничений.
В принципе, нет ничего плохого в том, чтобы помещать одинаковые контейнеры друг в друга. Например, с пакетами или сумками это легко проделать не только в базе данных, но и в реальности. Чтобы не увлечься подобными экспериментами, нужно не забыть про толщину пакета при указании внешних размеров.
Но для укладок зацикливание вложенности проверяется обязательно. Дело не только в том, чтобы не позволить вложить укладку в саму себя, но и в том, что любая укладка может быть изменена после того, как ее куда-то вложили. То есть зацикливание может возникнуть случайно.
Конечно, подобные неприятности могли бы предотвращаться сами собой благодаря проверке размеров и объема. Но если укладка не имеет собственного контейнера (то есть просто куча), у нее нет способности так предотвращать зацикливание.
Поэтому проверка зацикливания вложенности выполняется каждый раз, когда происходит добавление вложенных укладок, и она может выявить неочевидные цепочки, в которых возникло зацикливание.
В конфигурации пока не сделаны некоторые полезные вещи, на которые не хватило запала. Со временем они могут появиться, но обещать ничего не буду. Кое-что довольно просто реализовать, но есть и такие улучшения, с которыми придется повозиться:
- возможность изменять количество у контейнеров с вложениями (сейчас можно только для вложенных укладок и пустых контейнеров)
- как следствие предыдущего пункта – возможность помещать предметы в контейнеры, у которых количество отличается от единицы
- наличие отделений у контейнеров, то есть группировка контейнеров в нечто, что само по себе является предметом и контейнером
- преобразование контейнера во вложенную укладку и наоборот
- преобразование отделения в обособленный контейнер и наоборот
- создание укладки на основе другой укладки, так чтобы дочерняя укладка содержала только отличия от базовой
И еще есть ситуации, с которыми конфигурация в нынешнем виде не справляется.
Прежде всего, никак не учитывается взаимное расположение предметов. То есть по суммарному объему они вроде бы отлично помещаются в контейнере, а в реальности – ну никак. Или наоборот – формально не должны влезать, а на практике очень даже могут, если положить наискосок.
Не учитываются и свойства предметов, более сложные в обработке, чем просто габариты. Например, закругленные углы у прямоугольной пластиковой коробки. Всем известно, как часто они мешают положить в коробку что-нибудь действительно прямоугольное.
Или возьмем, к примеру, обыкновенные пластиковые стяжки, которыми скрепляют пучки проводов. Пусть будут длинные, сантиметров 30. Если их всего несколько штук, бывает удобнее согнуть их и положить в пакет меньшего размера. Тут-то и возникает нестыковка. Хотите укладывать в маленький контейнер – указывайте размеры в согнутом виде. Но для пачки стяжек важна реальная длина, потому что пачку сгибать неудобно. Осталось только решить, в какой момент несколько штук становятся пачкой. Или до каких пределов можно сгибать стяжку, если предусмотреть такую возможность.
В общем, есть над чем работать. Кстати, не спрашивайте, почему тут не реализована печать. Ответ в начале статьи. Зато сделаны списки сверки, чтобы ставить галочки на ноутбуке или планшете. Только не говорите, что не бывает планшетов с 1С. У меня есть один.